为什么此联合中的结构似乎向后排序

时间:2014-01-10 07:06:34

标签: c struct bit-manipulation unions

#include <stdio.h>

union bits_32{
    unsigned int x;
    struct {char b4,b3,b2,b1;} byte;
} ;

int main(int argc, char **argv){
    union bits_32 foo;
    foo.x=0x100000FA;
    printf("%x",foo.byte.b4 & 0xFF);
}

这将输出FA。为什么不输出10因为b4占据了第一个空格?

1 个答案:

答案 0 :(得分:5)

这取决于您机器的字节顺序。如果你的机器是小端,它打印FA(你的小端是吗?)。如果您的机器是大端,则打印10。

在内存中存储文字 我们将一个单词定义为32位。这与4个字节相同。整数,单精度浮点数和MIPS指令都是32位长。我们如何将这些值存储到内存中?毕竟,每个内存地址可以存储一个字节,而不是4个字节。

答案很简单。我们将32位数量分成4个字节。例如,假设我们有一个32位的数量,写为90AB12CD16,它是十六进制的。由于每个十六进制数字是4位,我们需要8个十六进制数字来表示32位值。

因此,4个字节是:90, AB, 12, CD,其中每个字节需要2个十六进制数字。

事实证明,有两种方法可以将其存储在内存中。 Big Endian 在big endian中,将最重要的字节存储在最小的地址中。以下是它的外观:

Address Value
1000    90
1001    AB
1002    12
1003    CD

Little Endian 在little endian中,将最低有效字节存储在最小地址中。以下是它的外观:

Address Value
1000    CD
1001    12
1002    AB
1003    90

请注意,与big endian相比,这是相反的顺序。要记住哪个是哪个,回想一下是先存储最低有效字节(因此,小端)还是先存储最高有效字节(因此,大端)。

注意我在最低有效位中使用了“byte”而不是“bit”。我有时将其视为LSB和MSB,其中'B'大写为引用字节并使用小写'b'来表示位。在字节序方面,我只提到最重要和最不重要的字节。