关于结构题内存转换的有关问题

关于结构题内存转换的问题
 在intel 32bit处理器上,下列输出多少?
  5     struct {
  6         int a: 3;
  7         int b: 2;
  8         int c: 3;
  9     }s;
 10
 11     char *p = (char*)&s;
 12     *p = 0x99;
 13     printf("a: 0x%x, b: 0x%x, c: 0x%x\r\n", s.a, s.b, s.c);
答案为什么是
a: 0x1, b:0xffffffff,c:0xfffffffc
------解决思路----------------------
位域不太好用,它不象我们想像那样取的数据, 象上面的s.b , 可能想法是 0x3&(*(int *)s>>3)这样取数据,但实际上编译器是通过移位来完成 , 还以s.b为便 ,得到二进制11b, 它需要向左移清除左边,这里问题最高位成了1, 再向右移执行的是算术右移,11的左边全部变成了1, s.c也是同理