【问题标题】:C programming bitfield in structure结构中的 C 编程位域
【发布时间】:2013-05-17 11:13:02
【问题描述】:

为什么是答案

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

【问题讨论】:

    标签: c structure bit bit-fields


    【解决方案1】:

    有符号整数以二进制补码表示。 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

    【讨论】:

    • 你能解释一下为什么 b1.c=-3 吗?
    • 为了迂腐,C 标准没有说明如何表示负整数...
    • @KerrekSB §6.2.6.2 的 C11 规范至少提到了三种可能的替代方案(符号/幅度、一个补码、二进制补码)——但不确定这是否是一个封闭列表
    • PowerPC,13 是 1101,为了得到一个数字的二进制补码,你翻转位并加 1。所以 0010 + 1 是 0011,这将是正数 3 而 1101 是负数表示,即 -3
    【解决方案2】:

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

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

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

    要获得负二进制补码的绝对值,请减一并将结果取反:

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

    1100b 倒转变成0011b 等于3d。由于符号位是负数(在进行之前的计算之前你必须检查它),结果是-3d

    【讨论】:

    • 你能解释一下为什么 b1.c=-3 吗?
    • 感谢您的解释,但很难消化:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多