0x12345678 的特定大端小端表示?

问题描述 投票:0回答:3

mem32[&100]=&12345678 如果使用大端寻址,mem8[&101]是什么?

我得到答案 56,这是我的推理;

据我了解;在大端系统中,最高有效字节首先存储在内存中,即:

0x100 0x101 0x102 0x103
78    56    34    12

但“正确”答案是 34。

有人可以解释为什么吗?/告诉我答案是错误的?

编辑:我意识到我的错误。一时忘记了最左边的数字是最重要的!

arm endianness
3个回答
1
投票

尤其是 Arm,但你必须小心字节序。一般来说,请阅读处理器的文档。 Arm 有两种大端表示法,您的 Arm 支持哪一种表示法基于 1) 年龄/历史记录和 2) 交易类型。

如果您使用的是 BE-32 或字不变的旧设备,则大端模式下的 32 位事务与小端事务相同,从字节角度来看,地址 0x100 处的 0x12345678 的结果是(对于两者)大端和小端)

0x100 78
0x101 56
0x102 34
0x103 12

如果您要写入一个单词,然后以字节形式读回(在大端模式下),这就是您所看到的。

如果您使用的是 BE-8 或字节不变的更现代的手臂,那么从字节角度来看,0x12345678 的 32 位(数据)大端写入将给出

0x100 12
0x101 34
0x102 56
0x103 78

使用这些地址将其读回为字节时(以大端或小端模式)。

但是在 BE-8 上将 0x34 写入 0x101 会给出

0x101 0x34

在处理器的大端和小端模式下...字节不变。

在 be-8 系统上,指令始终都是小端字节序,这使得编译器变得更加噩梦。 (在大端模式下,读取和获取对同一地址给出不同的结果)

一般来说,对于arm或一般来说,即使架构声称支持大和小,也请使用架构的本机字节序。更有可能找到有效的工具,并且更有可能减少工具中的错误。一些供应商出于某种疯狂的原因拥有基于 Arm 的内核,这些内核仅是大端模式,当然我正在考虑的也有小端版本,购买那个。

现在您知道要寻找什么,只需进行简单的谷歌搜索即可找到图表,显示程序员在 Arm 网站上针对不同事务大小在 BE-8 和 BE-32 之间的内存视图。

如果您对其他架构感兴趣,请查看这些具体细节。并且始终进行系统工程,如果某人或某处提到了字节顺序,请不要立即假设您正在进行字节交换,您所做的以及如何做,如果您只是进行系统工程,那么它是免费的并且是正确的。许多人在做出此类假设时都会犯错,并且很难理解原因。我们真的应该从我们的词汇表中删除大端和小端,因为它只会造成比解决的更多的混乱。


0
投票

对于 32 位值

0x12345678
12
是最高有效字节,这在大端系统上排在第一位,然后是
34
56
78

大端:

0x100 12
0x101 34
0x102 56
0x103 78

小端:

0x100 78
0x101 56
0x102 34
0x103 12

0
投票

你搞错了:

0x100 0x101 0x102 0x103
78    56    34    12

这是 BIG endian 中的 0x78563412,或者 LITTLE endian 中的 0x12345678。

BIG endian 中的 32 位值 0x12345678 是

12 34 56 78

© www.soinside.com 2019 - 2024. All rights reserved.