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

*********************************************************************

 * 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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值