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

Dan*_*Dan 2 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);
}
Run Code Online (Sandbox Code Playgroud)

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

Chi*_*nna 5

这取决于您的机器的endianess.如果你的机器是小端,它打印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
Run Code Online (Sandbox Code Playgroud)

Little Endian 在little endian中,将最低有效字节存储在最小地址中.这是它的样子:

Address Value
1000    CD
1001    12
1002    AB
1003    90
Run Code Online (Sandbox Code Playgroud)

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

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