为啥同时使用小端和大端?
Posted
技术标签:
【中文标题】为啥同时使用小端和大端?【英文标题】:Why are both little- and big-endian in use?为什么同时使用小端和大端? 【发布时间】:2011-06-12 18:27:34 【问题描述】:为什么在大约 40 年的二进制计算机科学之后,今天仍然在使用 little-endian 和 big-endian?是否有算法或存储格式可以更好地与另一种一起使用?如果我们都切换到一个并坚持下去不是更好吗?
【问题讨论】:
你只是偷了我嘴里的话。 :)。谢谢 如果我们的数字不是从闪米特语中得到的,我们也会是 little-endian。 【参考方案1】:大端和小端都有其优点和缺点。即使一个明显优越(事实并非如此),任何遗留架构都无法切换字节顺序,所以恐怕你只需要学会接受它。
【讨论】:
我正在寻找通用或特定的示例。 little-endian (经常,但不总是)对 home-rolled bignum 实现有用(即使用大于机器字长的整数)。【参考方案2】:Little Endian 使类型转换更容易。例如,如果您有一个 16 位数字,您可以简单地将相同的内存地址视为指向 8 位数字的指针,因为它包含最低 8 位。所以你不需要知道你正在处理的确切数据类型(尽管在大多数情况下你确实知道)。
Big Endian 更易于阅读。位存储在内存中,因为它们按逻辑顺序出现(最重要的值在前),就像任何人类使用的数字系统一样。
在有很多很多抽象层的时候,这些参数实际上不再重要了。我认为我们仍然拥有两者的主要原因是没有人愿意转换。任何一个系统都没有明显的原因,所以如果你的旧系统运行良好,为什么要改变任何东西呢?
【讨论】:
我不太关注你的类型转换评论。 在 little-endian 系统中,最低有效位在内存中排在第一位。因此,您可以将此内存指针视为 8 位值(您将获得 8 个最低有效位)、16 位值等。您将始终按预期顺序获得正确的位数。在大端系统上,您将获得最高有效位,这不是您在将较大数据类型类型转换为较小数据类型时所期望的。 类型转换通常在寄存器中完成 - 否则你不能签名扩展等 - 除了重新解释转换,在这种情况下你是对的,但是在一些大端机器,指针指向单词的最后一个字节,而不是第一个字节,这只会加剧所有混乱。 小端类型转换技巧只有在您缩小数据类型时才真正起作用,例如将短路转换为 char。如果要转换为有符号类型,显然需要额外的存储空间和符号扩展。 我认为他的意思是记忆的检索。无论数字有多大或多小,CPU都不必移动它在内存中查找的位置。如果它在 CPU 上的寄存器或缓存中,CPU 将不得不检索它,此时它可以重用它上次使用的内存地址。但是,如果它是大端,它必须调整它上次使用的内存地址。在任一系统中,都必须再次检索 CPU 上的数据。 (无论如何,缩短在 CPU 上的优势与数据存在相同)。【参考方案3】:当添加两个数字时(在纸上或机器中),您从最低有效数字开始,然后向最高有效数字工作。 (许多其他操作也是如此)。
在具有 16 位寄存器但数据总线为 8 位的 Intel 8088 上,小端序允许此类指令在第一个内存周期后开始操作。 (当然,一个单词的内存提取应该可以按降序而不是递增的顺序完成,但我怀疑这会使设计有点复杂。)
在大多数处理器上,总线宽度与寄存器宽度相匹配,因此这不再具有优势。
另一方面,大端数可以从 MSB 开始进行比较(尽管许多比较指令实际上执行减法运算,无论如何都需要从 LSB 开始)。符号位也很容易获得。
是否有算法或存储 与一个和 和对方差很多?
没有。这里和那里都有一些小优势,但没有什么大不了的。
我其实觉得 litte-endian 更自然更一致:一点的意义是 2 ^ (bit_pos + 8 * byte_pos)。而使用大端序时,位的意义是 2 ^ (bit_pos + 8 * (word_size - byte_pos - 1))。
如果我们都改用一个并坚持下去不是更好吗?
由于 x86 的主导地位,我们肯定倾向于小端。许多移动设备中的 ARM 芯片具有可配置的字节顺序,但通常设置为 LE 以更兼容 x86 世界。这对我来说很好。
【讨论】:
哇,我从来不知道每个字节的位也是从最低到最高存储的。所以 10=0x0A 真的存储为01010000
而不是二进制 00001010?在 BE 系统上也是这样吗?
@krubo 最小的可寻址单元是字节,所以实际上你认为如何排列位是完全任意的。位如何“存储”在一个字节中完全取决于您要遵循的约定。如果您将选择的约定写在纸上,您确实会将值 10 写为 Little Endian 中的 01010000 和 Big Endian 中的 00001010。以上是关于为啥同时使用小端和大端?的主要内容,如果未能解决你的问题,请参考以下文章