2
#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

4 回答 4

4

你应该使用unsigned int. 如果使用有符号值,最高位定义数字是负数还是正数。如果您只有一位,并且这是 1,那么它将被解释为负数,因为设置了最高位。

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

您可以通过%u在 printf 命令中使用来修改输出,但是在分配它并将其与其他值进行比较时,您仍然可能会产生不需要的效果。

于 2013-07-07T09:10:30.193 回答
1

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

于 2013-07-07T09:18:27.803 回答
0

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

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

于 2013-07-07T09:14:11.487 回答
0

该标准没有指定int位域中是有符号还是无符号。相反,它会强制您明确指定签名。

位域的类型应为 、 、 或其他一些实现定义的类型的合格或非_Bool合格signed int版本unsigned int

于 2013-07-07T12:45:43.253 回答