【问题标题】:Little-endian and Big-endian小端和大端
【发布时间】:2014-10-05 15:50:43
【问题描述】:

我必须编写一个例程来在两种表示之间进行转换。 但我有点困惑。 如果我的架构具有 32 位字的内存 我必须存储单词 0xA15D23B1 使用 Big-endian,内存在 23 后 5D 后变为 A1,最后变为 B1 与 Little-endian 相比,记忆是 B1 后 23 后 5D 和 A1 后 这样对吗?

如果我可以寻址我机器上的单个字节并且我的单词地址为零 谁是字节 1? Big-endian 是 5D?小端也是5D?

感谢所有回答我的人

【问题讨论】:

  • 不,这不对,你搞反了。在 little endian 中,最低有效字节具有最低地址。
  • 你的第一段是正确的,除了“之后”这个词的不正确使用,这使它有点混乱(我认为你的意思是“跟随”而不是“之后”)。我不明白你在第二段中问什么。
  • 您已经回答了您的问题。 “B1 之后 23 之后 5D 之后和 A1 之后。”你能描述一下你实际的编程问题吗?地址零通常对程序不可用。您可以使用 hton 之类的函数来避免完全处理字节序问题。
  • (另外,这与通用列表有什么关系?)
  • 您的编程需求是什么?你想从小端转换为大端还是反之?

标签: c endianness


【解决方案1】:

Big-endian 内存布局是最高有效字节在前,而 little-endian 内存布局是最低有效字节在前。给定值 0xA15D23B1:

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

请注意,big-endian 内存布局不会随字长变化,但 little-endian 会。如果考虑两个短字(16 位)0xA15D 和 0x23B1 连续存储:

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

【讨论】:

    【解决方案2】:

    处理器实现 big-endian 和 little-endian 有多种方式 — 有关详细讨论,请参阅维基百科文章 Endianness

    对于 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)具有允许在数据段、代码段或两者都有。

    【讨论】:

      【解决方案3】:

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

      Big-endian 从大(最重要)的一端开始; little endian 从小端开始。

      例如,当将单词 0xA15D23B1 视为字节序列时,大端机器从最高有效字节 0xA1 开始。它将被存储在最低地址(这是可能令人困惑的单词“开始”的含义)。

      顺便说一句,如果你只想从大端转换到小端或返回,你不必理解这一点:只需颠倒字节顺序!这就是为什么很多人懒得去理解what "big-endian" or "little-endian" means——你通常只需要了解是否交换字节即可。

      【讨论】:

      • 这是一种很好的记忆方式
      【解决方案4】:
      • 在 little-endian 中也是 5D 吗?

      没有。在 little-endian 中是 23

      【讨论】:

        猜你喜欢
        • 2011-12-24
        • 1970-01-01
        • 2011-02-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-02-15
        • 2014-01-11
        • 1970-01-01
        相关资源
        最近更新 更多