使用C中的结构的不可预测的输出

时间:2013-07-07 09:07:52

标签: c struct bit-fields

#include<stdio.h>
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);
}

此代码的输出为“-1 2 2”   请澄清此输出背后的逻辑。 bit.bit2和bit.bit3的值始终与分配给它的值相同,但bit.bit1正在以不同的整数值更改。为什么呢?

4 个答案:

答案 0 :(得分:4)

您应该使用unsigned int。最高位,定义如果使用有符号值,数字是负数还是正数。如果你只有一位,这是1,则它被设置为最高位时被解释为负数。

如果将其他值设置为15,您也会得到负输出。

您可以在printf命令中使用%u修改输出,但在分配和与其他值进行比较时,您仍可能会产生不良影响。

答案 1 :(得分:1)

int x : b ;表示您只将b位内存分配给x而不是默认的sizeof(int)字节。这种声明只能在结构内部进行 C中有符号整数的范围是-2^(b-1) to 2^(b-1)-1。其中b是用于存储整数的位数。在所有上述情况下都会发生溢出。一个好的编译器应该给你一个关于溢出的警告。

答案 2 :(得分:0)

大小为1的有符号位字段接受[-1 ... 0]范围内的值。这是通式[-2 ^(N-1)... 2 ^(N-1)-1]的结果,用于确定可以存储在N位中的值的范围,其中N = 1的2的补码表示。

如果您希望bit1保留值0或1,则可以将其声明为unsigned int bit1 : 1;

答案 3 :(得分:0)

标准未指定位字段中的int是有符号还是无符号。相反,它会强制您明确指定签名。

  

位字段应具有合格或不合格的类型   版本_Boolsigned intunsigned int或其他   实现定义的类型。