如果我希望我的代码在 32 位和 64 位平台上都正确运行,我需要考虑什么?
编辑:我需要注意哪些方面,例如打印字符串/字符或使用结构?
如果我希望我的代码在 32 位和 64 位平台上都正确运行,我需要考虑什么?
编辑:我需要注意哪些方面,例如打印字符串/字符或使用结构?
一种解决方案是针对在两个平台上运行的虚拟环境(我在想 Java,或者这里的 .Net)。
或者选择一种解释语言。
您是否有其他要求,例如调用现有代码或库?
你应该一直做同样的事情来确保你编写可移植的代码:)
Mozilla 指南和C 常见问题解答是很好的起点
我假设您仍在谈论为每个单独的平台单独编译它们?因为只需创建一个 32 位二进制文件,就可以在两者上运行它们。
最大的问题是确保不要将指针放入 32 位存储位置。
但是,这个问题并没有正确的“与语言无关”的答案,真的。如果您将自己限制在标准的“C”或“C++”之类的东西上,您甚至无法得到一个特别明确的答案——数据存储、指针等的大小都非常依赖于实现。
老实说,这取决于语言,因为像 C# 和 Java 这样的托管语言或像 JavaScript、Python 或 PHP 这样的脚本语言都被锁定在他们当前的方法中,并且要开始并做任何超出高级内容的事情,没有太多可担心的.
但我的猜测是你问的是像 C++、C 和其他低级语言这样的语言。
您最需要担心的是事物的大小,因为在 32 位世界中,您仅限于 2^32 的幂,而在 64 位世界中,事物会变得更大 2^64。
使用 64 位,您可以在 RAM 中拥有更大的内存和存储空间,并且可以计算更大的数字。但是,如果您知道您正在为 32 和 64 进行编译,则需要确保将您对系统的期望限制在 32 位世界以及缓冲区和数字的限制。
在 C(可能还有 C++)中,在计算 malloc 的缓冲区大小时,请务必记住使用 sizeof 运算符。这样,无论如何您都将编写更多可移植代码,这将自动考虑 64 位数据类型。
在大多数情况下,您唯一需要做的就是为两个平台编译代码。(这是假设您使用的是编译语言;如果不是,那么您可能不需要担心任何事情。)
我能想到的唯一可能导致问题的事情是假设数据类型的大小,这可能是您无论如何都不应该做的事情。当然,任何用汇编语言编写的东西都会引起问题。
请记住,许多编译器根据底层架构选择整数的大小,因为“int”应该是系统中最快的数字操纵器(根据一些理论)。
这就是为什么这么多程序员在他们最可移植的程序中使用 typedef 的原因——如果你想让你的代码在从 8 位处理器到 64 位处理器的所有东西上工作,你需要认识到,无论如何,在 C 中,int 没有严格定义。
指针是另一个需要小心的领域——如果你在摆弄指针的数值,不要使用 long、long long 或任何特定类型——使用正确的构造,不幸的是,它因编译器而异(这就是为什么您使用的每个编译器都有一个单独的 typedef.h 文件)。
——亚当·戴维斯