#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正在以不同的整数值更改。为什么呢?
答案 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
是有符号还是无符号。相反,它会强制您明确指定签名。
位字段应具有合格或不合格的类型 版本
_Bool
,signed int
,unsigned int
或其他 实现定义的类型。