Memory 小端与大端体系结构

Memory 小端与大端体系结构,memory,cpu-architecture,endianness,data-representation,Memory,Cpu Architecture,Endianness,Data Representation,我有一个问题,这是一种与大学教授的分歧,关于Endianness,所以我没有找到任何方法来解决这个问题并找到正确的答案,而是在Stack Overflow社区提问并展开讨论 我们假设这个数(十六进制)11FF1定义为整数,例如在C++中,它将是:int num=0x11ff1,并且我说这个数字将出现在小Endia >的内存中: addr[0] is f1 addr[1] is 1f addr[2] is 01 addr[3] is 00 in binary : 1111 0001

我有一个问题,这是一种与大学教授的分歧,关于Endianness,所以我没有找到任何方法来解决这个问题并找到正确的答案,而是在Stack Overflow社区提问并展开讨论

我们假设这个数(十六进制)11FF1定义为整数,例如在C++中,它将是:int num=0x11ff1,并且我说这个数字将出现在<强>小Endia<强> >的内存中:

 addr[0] is f1   addr[1] is 1f   addr[2] is 01   addr[3] is 00
 in binary : 1111 0001   0001 1111   0000 0001   0000 0000
由于编译器将0x11ff1视为0x0001ff1,并将00视为第一个字节,将01视为第二个字节,依此类推,对于大端字节,我相信它会是这样的:

 addr[0] is 00   addr[1] is 01   addr[2] is 1f   addr[3] is f1
 in binary : 0000 0000   0000 0001   0001 1111   1111 0001
但他有另一种观点,他说:

Little Endian

大端词

事实上,我看不出他的表达有任何逻辑性,所以我希望开发人员解决这个分歧,提前谢谢


你的十六进制数和二进制数是正确的

你(教授的?)对小恩迪安的法语形象毫无意义,这三种表达方式都与其他两种表达方式不一致

73713是十六进制的
0x11ff1
,因此没有任何
0xFF
字节(二进制
11111111
)。
在32位低位字节中,字节按内存地址递增的顺序排列。
您可以从完整十六进制值的低端获取成对的十六进制数字(字节/八位字节),然后在消耗完该值后用零填充

看起来他们可能在十六进制值的错误一侧填充了0到0,扩展到32位,如
0x11ff1000
,而不是
0x00011ff1
。请注意,这些是整数的完整十六进制值,而不是试图以任何顺序将其分解为单独的十六进制字节

但是十六进制和二进制不匹配;它们的二进制文件以一个全1字节结尾,因此它将
FF
作为高位字节,而不是第3个字节。我没有检查它是否与PDP(混合)endian中的十六进制匹配

他们将十六进制列分成4字节大小的组,这似乎表明它以内存顺序显示字节。但是这列在他们的大端和小端图像之间是相同的,所以很明显这不是他们正在做的,他们实际上只是通过左移将它扩展到32位(用低而不是高零填充)

此外,大端和小端的二进制字段并不是相反的。要从大端到小端翻转,需要颠倒整数中字节的顺序,保持每个字节值相同。(如x86
bswap
)。他们的
11111111
(FF)字节在大端码版本中排名第二,但在小端码版本中排名最后


TL:DR:不幸的是,我看不出这些图像有任何意义。

谢谢你的回答@PeterCordes@OmarGhannou:如果这回答了您的问题,请在投票箭头下用复选标记将其标记为接受。顺便说一句,你可以把这个答案和你的教授联系起来。我试着表达它,这样你就可以这样做,只是谈论技术细节。我想宣布,教授已经完全响应并更正了上面的例子。