为什么这个联合体中的结构看起来是向后排列的 #包括 联合比特32{ 无符号整数x; 结构{char b4,b3,b2,b1;}字节; } ; int main(int argc,字符**argv){ 联合比丘32富; foo.x=0x100000FA; printf(“%x”,foo.byte.b4&0xFF); }

为什么这个联合体中的结构看起来是向后排列的 #包括 联合比特32{ 无符号整数x; 结构{char b4,b3,b2,b1;}字节; } ; int main(int argc,字符**argv){ 联合比丘32富; foo.x=0x100000FA; printf(“%x”,foo.byte.b4&0xFF); },c,struct,bit-manipulation,unions,C,Struct,Bit Manipulation,Unions,这将输出FA。既然b4占据了第一个空间,它为什么不输出10呢?这取决于您的机器的长度。如果你的机器是little endian,它会打印FA(你的机器是little endian对吗?)。如果你的机器是big endian,它会打印10 在内存中存储单词 我们已经定义了一个单词,表示32位。这与4个字节相同。整数、单精度浮点数和MIPS指令都是32位长。我们如何将这些值存储到内存中?毕竟,每个内存地址可以存储一个字节,而不是4个字节 答案很简单。我们将32位的数量分成4个字节。例如,假设我们有一

这将输出FA。既然b4占据了第一个空间,它为什么不输出10呢?

这取决于您的机器的长度。如果你的机器是little endian,它会打印FA(你的机器是little endian对吗?)。如果你的机器是big endian,它会打印10

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

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

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

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

#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);
}
Address Value
1000    90
1001    AB
1002    12
1003    CD
Little Endian 在little endian中,将最低有效字节存储在最小地址中。下面是它的外观:

#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);
}
Address Value
1000    90
1001    AB
1002    12
1003    CD
请注意,这与big-endian的顺序相反。要记住哪个是哪个,回想一下是先存储最低有效字节(因此,小尾端)还是先存储最高有效字节(因此,大尾端)


注意,我在最低有效位中使用了“byte”而不是“bit”。有时我将其缩写为LSB和MSB,其中“B”大写表示字节,使用小写的“B”表示位。我只在谈到尾数时提到最高有效字节和最低有效字节

IIRC x86是little endian,所以是的。我误解了endianness是如何工作的,所以这就是困惑。谢谢。(稍微更正一下:除了小端和大端之外,还有各种“中间端”存储超过两个字节的单词的可能性。C允许它们,所以有不止“两种方式”。@Arkku是的,我同意。如果你有关于这方面的数据,请编辑我的帖子并添加它。Thanksx86是little-endian。这是因为像其他人所说的endian。但编译器可能会移动变量和结构元素以适应内存对齐,因此在所有小端计算机上的结果可能不一样。最好使用数组而不是4个字符。我要记住,我只是在玩低级构造,为明天的面试做准备。