新mac的endian-ness - 现在所有的pc平台都一样吗?

时间:2008-09-17 21:37:12

标签: macos endianness

将mac更改为英特尔芯片是否意味着我们已经完成了对二进制资源中的数字进行交叉平台数据分发的工作?

这是这个问题的最后一个还是有其他一些我不知道的平台?

7 个答案:

答案 0 :(得分:9)

您似乎忘记了超越处理器架构的字节序。有许多算法和协议要求特定的字节顺序。例如,我花了两周时间试图让MD5哈希算法工作,只是意识到我已经假设网络字节顺序(Big Endian),而Ronald Rivest假定(在RFC中没有说明)实现者会使用Little字节序字节顺序。

提醒我有时伤害那个男人。 :-P

答案 1 :(得分:9)

嗯,实际上还有很多大端的CPU遗留下来。

实际上PPC并没有死。你知道,Xbox360使用PPC CPU(这是一个很好的例子,这些CPU没有声誉那么糟糕 - Xbox360不是很慢)。好的,这个可能算不上PC了。

但服务器是否算作PC?仍然有很多服务器使用Sun的UltraSparc CPU,它们通常都是大端,尽管最新型号可能是大端或小端。有许多CPU可以是一个或另一个(例如ARM,仍然在许多设备中使用,如移动电话等),因为支持两者都为硬件和软件供应商增加了最大的灵活性。即使是IA64 CPU(Intanium,在AMD发明x86-64之前打算取代x86,这是真正的64位,只能模拟32位,不像x86-64,可能两者都是)可以是CPU之一切换到大端。可以是两者的CPU都称为双端。

实际上,如果您暂时忽略英特尔(和兼容的CPU),市场上的大多数CPU都是大端或至少是双端的,尽管据我所知,大多数这些CPU都没有在任何消费者PC中使用。

然而,我认为没有像许多程序员那样的endian问题。每个现代CPU都可以在硬件中交换endian。实际上,如果你在一个小端的英特尔CPU上编写一个程序,它会交换从内存中读取的每个整数的字节顺序,并在写回内存时再次,这可能会导致性能损失低至5%;在实践中,您只需要为进入和离开应用程序的数据交换endianess,因为在您的应用程序中,endianess当然是不变的。

另请注意: 我所知道的几乎所有网络协议都将字节顺序指定为大端,TCP / IP是最熟悉的系列。因此,如果您在较低的网络层上工作,您将始终必须继续交换字节。

答案 2 :(得分:4)

这肯定不是最后一个问题,特别是如果您正在为嵌入式系统(包括Pocket PC等)编写代码.MIPS,ARM和其他架构支持双端架构,可以在系统启动时选择它们的字节序-up。

如果您正在编写依赖于字节排序的代码,则需要关注字节序。不要指望这个“问题”很快就会消失。

答案 3 :(得分:3)

我在考虑同样的问题:由于Mac现在是英特尔,因此会出现问题吗?不。除了某些超级计算机(让我们面对它,我们的平民将永远不必处理),仍然有一个使用大端命令的主要领域:网络协议,特别是:互联网协议(如:TCP / IP的“IP”)。

答案 4 :(得分:2)

Pesky x86弄脏了我的内存寄存器及其段指针! ;)

我相信你不再需要在PC和Mac之间翻转单词,假设你正在避免与PowerPC向后兼容。

答案 5 :(得分:1)

现在,一个人的主计算机比以往任何时候都更不可能成为运行通用操作系统的桌面计算机。虽然这仍然很常见,但许多其他人正在使用专门构建的智能手机或umpc设备,即浏览网页。这些平台不一定有x86 cpu。更常见的是,特别是对于智能手机设备,他们使用的是ARM内核,这是一个大端。

答案 6 :(得分:0)

定义PC,您认为PC是什么?

我目前正在从在arm 9处理器上运行的Linux发行版中键入此内容,可以将其设置为不同的字节顺序,但默认为big endian。 Intel,AMD和Via(x86兼容)使用Little endian。

Endian-ness不会很快消失,任何时候你通过网络传输任何东西,你必须确保它是正确的字节顺序,因为Internet协议指定的字节序实际上是大端。

有关详细信息,请参阅Wikipedia article on Endianness