我有一个问题,这是与大学教授关于字节顺序的一种分歧,所以我没有找到任何方法来解决这个问题并找到正确的答案,而是在 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
但他有不同的意见,他说:
小端存储
大端存储:
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/