有符号及无符号位域值的测试

/*********************************************************************

 * Author  : Samson
 * Date    : 04/02/2014
 * Test platform:
 *              Linux ubuntu 3.2.0-58-generic-pae
 *              GNU bash, version 4.2.39
 * *******************************************************************/

程序如下:

#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;
}

结果为:

v0id@ubuntu:~/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;

v0id@ubuntu:~/test$ ./a.out
a is 1 b is 3 c is 1

修改test.b的值为4,结果为:0

修改test.b的值为7,结果为:3




你可能感兴趣的:(有符号及无符号位域值的测试)