C编程位域结构

时间:2013-05-17 11:13:02

标签: c structure bit bit-fields

为什么要回答

-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位编辑器上编译。非常感谢。

2 个答案:

答案 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)

由于ac是带符号位的有符号整数,因此它们是负数:

a:  1d =    1b (1 bit)
b:  2d =  010b (3 bits)
c: 13d = 1101b (4 bits)

有符号整数值存储在二进制补码中,最高位表示符号(1表示“负”)。因此,当您将位域值读取为signed int时,您会得到ac的负值(符号扩展并从其二进制补码表示转换回来),但是为2 b

要获得负二的补数的绝对值,减去一并反转结果:

 1101b
-0001b
======
 1100b

1100b倒置变为0011b,等于3d。由于符号位为负数(无论如何您必须在执行上一次计算之前检查),结果为-3d