编译时确定字节序吗?

7

我希望能够写一些代码,如果目标机器的字节序与我的不同,它就会出错。但是当然,我想知道什么时候会出错,这样我就可以在必要时修复它。

浮点数和整数的字节序是编译程序的属性吗?我是否可以通过某种断言在编译时检查它?还是说这是我必须在运行时断言的东西?


7
字节序是由硬件决定的,更具体地说,取决于使用的CPU。 - Some programmer dude
1
不,你需要提前知道字节序是什么。比如说,考虑一个指向整数的指针。那么这个指针的内存地址指向的是这个int的高字节还是低字节? - Marc B
3
"endianness of floats",对于浮点数不确定是否适用。对于整数是适用的,但是两个具有相同字节顺序的CPU可能在内部以不同的方式表示浮点数。 - Pierre Emmanuel Lallemant
1
你可以假设小端序在大多数目标中都能正常工作。 - Pierre Emmanuel Lallemant
2
你可以进行交叉编译以处理其他目标,因此即使你在小端硬件下,也可以生成针对不同目标的可执行文件(虽然无法在你的硬件上运行,但可以从单台机器上完成)。 - Pierre Emmanuel Lallemant
显示剩余2条评论
3个回答

6

是的,字节序是特定机器固有的,在编译时就已知。大多数操作系统都会在某个地方设置一个#define来告诉你字节序。

特别地,对于Linux,您可以执行以下操作:

#if __BYTE_ORDER == __LITTLE_ENDIAN
...
#elif __BYTE_ORDER == __BIG_ENDIAN
...
#elif __BYTE_ORDER == __PDP_ENDIAN
...
#else
...
#endif

1
为PDP...运行Linux加1! :-) - alk
1
一个不错的_Linux_答案。操作系统不设置#define,编译器才会这样做。可以改进并讨论整数和浮点数的字节序差异。 - chux - Reinstate Monica

2

一些硬件提供两种模式(例如PowerPC)......但通常有本地模式。无论如何,编译时断言通常就足够了。


3
有趣的事实,我不知道这个。 "无论如何,编译时断言通常是足够的。" 如果我要以文件或网络形式在机器之间交换数据,我可能更愿意尝试编写“字节序透明”的代码。 - πάντα ῥεῖ
@πάνταῥεῖ 也许你应该考虑将_"当然在编译时已经决定了"_从你的回答中移除? - Lightness Races in Orbit
@πάνταῥεῖ OP说他需要破解字节序,他可能有很好的理由。 - Jean-Baptiste Yunès
@Jean-BaptisteYunès:“当然,我想知道它什么时候会出问题。”我并不相信这是正确的方法。 - πάντα ῥεῖ
@LightnessRacesinOrbit 我稍微调整了那个声明。 - πάντα ῥεῖ

1

浮点数和整数的字节序是编译程序的属性吗?我可以通过某种断言在编译时检查它吗?

在编译时决定生成哪些机器代码。程序不能被编译成适用于完全不同 CPU 架构的机器代码。

要在运行时检查当前硬件使用的字节序,有几种方法可用。

还请参见 在编译时确定字节序


不要在代码中使用断言来假定特定的字节序,而应该使用技术使任何保存到文件或通过网络连接通信的数据都透明地处理字节序。

一种方法是仅指定使用大端数据,代码使用hton<x>(), ntoh<x>()函数族对数据进行编码和解码(另请参见网络字节顺序)。


实际上,几天前在x86下有一个关于这个问题的提问,嗯,这是可能的。想想Mac程序可以在x86或PowerPC上运行等等。但这两个程序在一个可执行文件中各自拥有自己的字节序,这由CPU/平台决定。 - Rudy Velthuis
1
@RudyVelthuis:没有一个程序能够在x86和PowerPC上运行。那些表现得像这样的程序实际上在可执行文件中有两个CPU的二进制文件,操作系统决定加载和执行“phat”可执行文件的哪一部分。所以这就像运行两个不同的程序。如果其中一个使用int创建“保存文件”,而没有像建议的hton<x>()那样的字节序保护机制,那么在另一个平台上加载这样的“保存”将是不可能的。所有数据的导入/导出都使用hton<x>()/等来确保从应用程序进出的数据具有固定的字节序。 - Ped7g
1
字节序并不是在编译时决定的。实际上,它在您启动最喜欢的文本编辑器并开始编写程序之前就已经确定了。 - PC Luddite
1
@PCLuddite,我不明白你的意思。编译器在你使用相应选项调用它的时候会自动选择字节序和目标架构。你听说过交叉编译吗? - πάντα ῥεῖ
@Ped7g:我知道这实际上是一个二进制文件中的两个不同程序。我甚至写过这个。 - Rudy Velthuis
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接