首页 > 请教一道关于c语言结构体的题目

请教一道关于c语言结构体的题目

代码如下:

#include <stdio.h>

struct bit {
    int a:3;
    int b:2;
    int c:3;
};

int main(int argc, char *argv[])
{
    struct bit s;
    char *c = (char *)&s;
    *c = 0x99;
    printf("s.a: %d; s.b: %d; s.c: %d\n", s.a, s.b, s.c);

    return 0;
}

0x99的二进制编码是 1001 1001,
我认为的结果是这样:
按照struct bit各域的位数, s.a 占3位, 应该是 100, s.b 占两位,是 11, s.c占3位,是 001.

但答案中 s.a 是 001, s.b 是 11, s.c 是 100,和我想的顺序相反。
输出结果也和答案一致:

s.a: 1; s.b: -1; s.c: -4

请教一下,为什么是这样呢?


这个问题其实没什么意义, 按照 C Programming Language 的说法:

Fields are assigned left to right on some machines and right to left
on others. This means that although fields are useful for maintaining
internally-defined data structures, the question of which end comes
first has to be carefully considered when picking apart
externally-defined data; programs that depend on such things are not
portable.

对于楼主的问题, a,b,c那个字段在前面 是和具体的实现相关的.


内存排列的低位、高位问题。

  1. 人类表示数字的时候,低位在最右边:0x99 = (高) 1001 1001 (低)
  2. 计算机中表示数字的时候,低位在最前面: struct { (低) int a; int b; int c; (高) }

低位跟低位对应,高位跟高位对应。

【热门文章】
【热门文章】