有标记及无标记位域值的测试
措施如下:
#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; }
功效为:
[email protected]:~/test$ ./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;
[email protected]:~/test$ ./a.out
a is 1 b is 3 c is 1
修改test.b的值为4,功效为:0
修改test.b的值为7,功效为:3
From:csdn博客 yygydjkthh