为什么是答案呢?
-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位编辑器上编译。非常感谢。
发布于 2013-05-17 19:17:56
有符号整数用二进制补码表示。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
发布于 2013-05-17 19:17:23
由于a和c是设置了符号位的有符号整数,因此它们是负数:
a: 1d = 1b (1 bit)
b: 2d = 010b (3 bits)
c: 13d = 1101b (4 bits)有符号整数值存储在二进制补码中,最高位代表符号(1表示“负”)。因此,当您将位字段值读取为有符号整型时,您会得到a和c的负值(扩展符号并从它们的2的补码表示中转换回来),但对于b,会得到一个正的2。
要获得负2的补数的绝对值,可以减去1并反转结果:
1101b
-0001b
======
1100b倒置后的1100b变成了等于3d的0011b。由于符号位为负(无论如何,在进行之前的计算之前都必须对其进行检查),因此结果为-3d。
https://stackoverflow.com/questions/16607592
复制相似问题