【问题标题】:Little Endian vs. Big Endian architecturesLittle Endian 与 Big Endian 架构
【发布时间】:2020-12-01 18:07:28
【问题描述】:

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

假设我们将这个数字 (hex)11FF1 定义为一个整数,例如在 C++ 中它会像:int num = 0x11FF1,而 我说 数字将在 little endian 机器的内存中显示为:

 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 作为 2nd byte 等等,对于 Big Endian 我相信它看起来像:

 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

但他有另一种看法,他说:

小端序

大端序:

其实我看不出他的表述有什么逻辑,所以我希望开发者解决这个分歧,提前谢谢。

【问题讨论】:

  • 我想宣布教授已经完全响应并纠正了上面的例子。

标签: memory cpu-architecture endianness data-representation


【解决方案1】:

您的十六进制和二进制数字是正确的。

您(教授?)小端的法语图像完全没有意义,这 3 种表示方式中没有一种与其他 2 种一致。

73713 是十六进制的0x11ff1,因此没有任何0xFF 字节(二进制11111111)。
在 32 位 little-endian 中,字节为F1 1F 01 00,按内存地址递增的顺序排列。
您可以通过从完整十六进制值的低端获取一对十六进制数字(字节/八位字节),然后在使用完该值后用零填充。

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

但是十六进制和二进制不匹配;他们的二进制以一个全1字节结束,所以它的高字节是FF,而不是第三个字节。我没有检查它是否与 PDP(混合)字节序中的十六进制匹配。

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

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

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

【讨论】:

  • 感谢您的回答@Peter Cordes
  • @OmarGhannou:如果这回答了您的问题,请在投票箭头下方用复选标记将其标记为已接受。顺便说一句,请随时将您的教授链接到这个答案。我试图表达它以便您可以这样做,只是谈论技术细节。
猜你喜欢
  • 1970-01-01
  • 2019-06-30
  • 1970-01-01
  • 2018-05-15
  • 2022-06-10
  • 2012-10-09
  • 2014-05-25
  • 2010-10-16
  • 1970-01-01
相关资源
最近更新 更多