博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

C 位域运算

Posted on 2013-12-06 11:28  ccmfc  阅读(306)  评论(0编辑  收藏  举报
typedef struct  
{
int a:2;
int b:2;
int c:1;
}test;
int main()
{
test t;
t.a = 1;
t.b = 3;
t.c = 1;
printf("%d",t.a);
printf("%d",t.b);
printf("%d",t.c);
}

结果是1 -1 -1

请问一下这是怎么算出来的?
1 -1 -1
还有就是根据CPU小端模式和大端模式,这几位是怎样放的?
小端模式
低 高
1 1 1 1 0 0 0 0

大端模式
高 低
0 0 0 0 1 1 1 1

 
1.有些信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制位。所以通过位域可以实现该功能。
2.下面再说下计算机的数值表示,对于二进制数(0,1代码)一般采用补码表示,正数的补码与原码相同,负数的补码符号位为1,其余位为该数绝对值的原码按位取反;然后整个数加1。
3.知道了上述两点,就容易判断了a表示有两位,又由于t.a=1,即用两位二进制代码表示为:01,所以值为1,同理t.b=3,用两位二进制代码表示为11,由于第一位为1,所以是负数,后位取反后为0,然后加1,得到结果为-1;由于c就一位,t.c=1,用二进制代码表示为1,所以为负,后面没有即认为是零,而考虑到第二条,故应绝对值加1,即-1