Little-endian和Big-endian

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

我必须编写一个例程以在两种表示形式之间进行转换。但是我有点困惑。如果我有一个带有32位字的内存的体系结构而且我必须存储单词0xA15D23B1使用Big-endian时,内存在23点之后的5D之后变成B1,最后变成B1与Little-endian相比,内存在5D之后23和A1之后是B1这样对吗?

如果我可以寻址机器上的各个字节,并且字的地址为零谁是字节1?在Big-endian中是5D吗?在little-endian中也是5D吗?

感谢所有会回答我的人

c endianness
4个回答
6
投票

大端存储布局首先是最高有效字节,而小端存储布局首先是最低有效字节。给定值0xA15D23B1:

Memory address    0  1  2  3
Big-endian       A1 5D 23 B1
Little-endian    B1 23 5D A1

请注意,大尾数的内存布局不会随单词大小而变化,而小尾数会有所变化。如果考虑两个短字(16位),则连续存储0xA15D和0x23B1:

Memory address    0  1  2  3
Big-endian       A1 5D 23 B1
Little-endian    5D A1 B1 23

1
投票

处理器可以采用多种方式实现大端和小端,有关详细讨论,请参阅Endianness上的Wikipedia文章。

对于2字节数量,只有两个选项:

Value:           0x1234 (MSB = 0x12, LSB = 0x34)
Little-endian:   LSB then MSB    0x34  0x12  — Intel, …
Big-endian:      MSB then LSB    0x12  0x34  — SPARC, PowerPC, …

对于4字节的数量,有更多选择,但是仍然有两个主要选择(加上历史的好奇心:]

Value:           0x12345678 (MSB = 0x12, NMSB = 0x34, NLSB = 0x56, LSB = 0x78)
Little-endian:   LSB, NLSB, NMSB, MSB    0x78  0x56  0x34  0x12
Big-endian:      MSB, NMSB, NLSB, LSB    0x12  0x34  0x56  0x78
PDP-11:          NMSB, MSB, NLSB, LSB    0x34  0x12  0x78  0x56

请注意,许多现代芯片组都是双端的,可以切换为以大端或小端模式运行:

某些架构(包括ARM版本3及更高版本,PowerPC,Alpha,SPARC V9,MIPS,PA-RISC,SuperH SH-4和IA-64)具有允许在数据段和/或代码段中切换字节序的设置。 。


0
投票
  • 在little-endian中也是5D吗?

没有在小端,它是23


0
投票

记住“哪个是哪个的好方法:

Big-endian从大端(最重要)开始;小尾数从小尾数开始。

例如,将单词0xA15D23B1视为字节序列时,big-endian机器会从最高有效字节0xA1开始。它将存储在最低地址(这是可能引起混淆的单词“开始”的含义)。

顺便说一句,如果您只想从big-endian转换为little-endian或返回,则不必了解这一点:只需反转字节顺序!这就是为什么许多人不愿意去理解what "big-endian" or "little-endian" means的原因-您通常只需要了解是否交换字节即可。

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