程序如下
#include <stdio.h>
#include <stdlib.h>
struct bitint
{
int a:2;
int b:2;
int c:1;
};
int main()
{
struct bitint test;
test.a = 1;
test.b = 3;
test.c = 1;
printf("a is %d b is %d c is %d\n", test.a, test.b, test.c);
return 0;
}
结果为:
[root@localhost /]# ./a.out
a is 1 b is -1 c is -1
因为首先类型为int,也即是有符号数,那么必须是有符号位的,那么也就是a,b,c这三个数的都会占一个符号位,符号为1的时候表示是负数,而a,b,c赋值后,在此的二进制为:a=1; b=11;c=1; 又由于b和c已经把符号位给填充了,所以b和c在此就是负数了,所以结果也就是把符号位上的值转换为正或负。
那么如果是越界了的结果呢?
修改test.b的值为4,二进制为100,已经越界了,那么在此时test.b的结果应该是0,因为越界了后,只是取的后两位的值,即为00,所以结果为0了
修改test.b的值为7,二进制的值为111,也越办了,取低位的两位为11,结果为-1,依次类推即可。
同理,当结果体为无符号数时,不同是把符号位也参入了最后结果的运算,不再有符号位,但是越界的处理是一样的。如把上面的结构体修改为无符号的,结果为:
unsigned int a:2;
unsigned int b:2;
unsigned int c:1;
[root@localhost /]# ./a.out
a is 1 b is 3 c is 1
修改test.b的值为4,结果为:0
修改test.b的值为7,结果为:3