为什么要回答
-1, 2, -3 ? (especially -3 ??? how come)
struct b1 {
int a:1;
int b:3;
int c:4;
} ;
int main()
{
struct b1 c = {1,2,13};
printf("%d, %d, %d",c.a,c.b,c.c);
return 0;
}
在VC ++ 32位编辑器上编译。非常感谢。
答案 0 :(得分:4)
有符号整数以二进制补码表示。 1位二进制补码数的范围是-1到0.因为二进制补码数的第一位表示它是负数,这就是你在那里所做的。
见这里: sign extend 1-bit 2's complement number?
对于第三个数字,它是相同的,你已经溢出了-8到7的范围,这是4位有符号整数的范围。
你打算做的就是制作所有int
- > unsigned int
请看这里的二十二补充说明: http://www.ele.uri.edu/courses/ele447/proj_pages/divid/twos.html
答案 1 :(得分:2)
由于a
和c
是带符号位的有符号整数,因此它们是负数:
a: 1d = 1b (1 bit)
b: 2d = 010b (3 bits)
c: 13d = 1101b (4 bits)
有符号整数值存储在二进制补码中,最高位表示符号(1表示“负”)。因此,当您将位域值读取为signed int时,您会得到a
和c
的负值(符号扩展并从其二进制补码表示转换回来),但是为2
b
。
要获得负二的补数的绝对值,减去一并反转结果:
1101b
-0001b
======
1100b
1100b
倒置变为0011b
,等于3d
。由于符号位为负数(无论如何您必须在执行上一次计算之前检查),结果为-3d
。