请解释位域1的输出

时间:2014-11-13 05:09:07

标签: c struct bit-fields

#include<stdio.h>

int main(){

    struct value
     { 
      int bit1:1;
      int bit2:4;
      int bit3:4;
     }
   bit ={1,2,2};
   printf("%d %d %d \n",bit.bit1,bit.bit2,bit.bit3);

   return 0;
}

输出:-1 2 2

嗨,我无法理解结构位域。负值是怎样的。

2 个答案:

答案 0 :(得分:3)

int bits:2;

可以存储00(0),01(1),10(-2),11(-1) *假设2s补码系统用于签名

unsigned int bits:2;

可以存储00(0),01(1),10(2),11(3)

可以表示的两种类型的位表示是相同的,但解释是不同的。

您正在使用:1,因此它可以存储0或-1,因此负输出。您正在尝试存储1,这不能由int :1表示,因此输出结果令人惊讶。外卖是,不要这样做。

结论几乎总是将unsigned用于位域成员。将结构重写为:

struct value
{ 
  unsigned int bit1:1;
  unsigned int bit2:4;
  unsigned int bit3:4;
};

答案 1 :(得分:2)

结构中的

bit1属于int类型。当您在unsigned之类的int之前未指定unsigned int时,它将被视为signed整数!对于bit1,你提到的大小为1位,这意味着bit1只能有2个值! 0和1.当您为bit1指定1时,它将打印-1,类型为int。我们知道,对于int变量,如果它设置了MSB位,则它是负数! bit2bit3的大小为4位,因此其值的范围可以是0到15(0b1111)。

要了解有关位字段的详情,请查看以下链接:http://www.tutorialspoint.com/cprogramming/c_bit_fields.htm