#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
嗨,我无法理解结构位域。负值是怎样的。
答案 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位,则它是负数!
bit2
和bit3
的大小为4位,因此其值的范围可以是0到15(0b1111)。
要了解有关位字段的详情,请查看以下链接:http://www.tutorialspoint.com/cprogramming/c_bit_fields.htm