有人可以提供一个资源来解释有关字段位的所有信息以及它们的工作原理吗?
struct byte
{
int one :1;
}
struct byte var={1};
printf("%d",var.one);
output: -1
答案 0 :(得分:2)
因为在您的实现中int
是signed int
并且在有符号整数中,最重要的位用作符号位。因此,宽度为1
且类型为signed int
的位字段仅包含值0
和-1
。
如果您想要unsigned int
或1
的值,请使用宽度为0
的{{1}}位字段。
答案 1 :(得分:2)
struct byte
{
int one : 1;
int two : 2;
};
字段1可以存储-1
(1b)或0
(0b)
字段2可以存储-1
(11b),-2
(10b),+1
(01b)或0
(00b)
struct byte
{
unsigned int one : 1;
unsigned int two : 2;
};
字段1可以存储1
(1b)或0
(0b)
字段2可以存储3
(11b),2
(10b),1
(01b)或0
(00b)
虽然在两种形式中可以存储的位模式是相同的,但是它们的解释(假设已签名的2s补码)根据您使用的是有符号还是无符号版本而有所不同。
道德:在bitfield中,除非您有充分的理由使用签名类型,否则几乎总是使用无符号类型。
答案 2 :(得分:0)
您将1
存储在Signed int中。那时,位位置被视为符号位以及数据位。
因此设置符号位(1
)表示输出为负数。因此它显示-1
作为输出