#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占据了第一个空格?
答案 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'来表示位。在字节序方面,我只提到最重要和最不重要的字节。