memory - Little Endian 与 Big Endian 架构

标签 memory cpu-architecture endianness data-representation

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

假设我们将这个数字(十六进制)11FF1 定义为整数,例如在 C++ 中,它将类似于:int num = 0x11FF1,并且我说 该数字将在小端机器的内存中显示为:

 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 in the professor view

大端存储:

Big Endian in the professor view

Actually I don't see anything logical in his representation, so I hope the developers Resolve this disagreement, Thanks in advance.

最佳答案

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

你的(教授的?)小端法的法语图像根本没有意义,这 3 种表示方式都与另外 2 种表示方式不一致。

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

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

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

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

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

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

关于memory - Little Endian 与 Big Endian 架构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63368949/

相关文章:

c - 即使我的计算机是 Little Endian,以 Binary 打印数字总是以 Normal 格式(BIG Endian)打印?

x86 - 字节序如何与SIMD寄存器一起工作?

c++ - 在 64 位操作系统中运行的 32 位应用程序可以寻址的不同内存的数量是多少?

haskell - 存在量化类型的内存占用和相关优化技术

c - 无法释放动态分配的二维数组

c++ - 在 C++ 中处理字节顺序

node.js - Meteor 在最小的 DigitalOcean Droplet 上崩溃(内存不足 : Kill process . ..)

x86 - MSROM 程序中的条件跳转指令?

cpu - 是什么让 CPU 架构为 "X-bit"?

linux - 'perf stat' 结果中的停滞周期前端和停滞周期后端是什么?