0

如果我希望我的代码在 32 位和 64 位平台上都正确运行,我需要考虑什么?

编辑:我需要注意哪些方面,例如打印字符串/字符或使用结构?

4

9 回答 9

2

选项:

使用虚拟机(例如 Java)以某种语言对其进行编码

在 .NET 中对其进行编码,并且不针对任何特定架构。.NET JIT 编译器会在运行之前为您将其编译为正确的体系结构。

于 2008-08-28T15:17:48.397 回答
1

一种解决方案是针对在两个平台上运行的虚拟环境(我在想 Java,或者这里的 .Net)。

或者选择一种解释语言。

您是否有其他要求,例如调用现有代码或库?

于 2008-08-28T15:14:55.083 回答
1

你应该一直做同样的事情来确保你编写可移植的代码:)

Mozilla 指南C 常见问题解答是很好的起点

于 2008-08-28T15:15:21.743 回答
0

我假设您仍在谈论为每个单独的平台单独编译它们?因为只需创建一个 32 位二进制文​​件,就可以在两者上运行它们。

于 2008-08-28T15:13:51.183 回答
0

最大的问题是确保不要将指针放入 32 位存储位置。

但是,这个问题并没有正确的“与语言无关”的答案,真的。如果您将自己限制在标准的“C”或“C++”之类的东西上,您甚至无法得到一个特别明确的答案——数据存储、指针等的大小都非常依赖于实现。

于 2008-08-28T15:14:40.013 回答
0

老实说,这取决于语言,因为像 C# 和 Java 这样的托管语言或像 JavaScript、Python 或 PHP 这样的脚本语言都被锁定在他们当前的方法中,并且要开始并做任何超出高级内容的事情,没有太多可担心的.

但我的猜测是你问的是像 C++、C 和其他低级语言这样的语言。

您最需要担心的是事物的大小,因为在 32 位世界中,您仅限于 2^32 的幂,而在 64 位世界中,事物会变得更大 2^64。

使用 64 位,您可以在 RAM 中拥有更大的内存和存储空间,并且可以计算更大的数字。但是,如果您知道您正在为 32 和 64 进行编译,则需要确保将您对系统的期望限制在 32 位世界以及缓冲区和数字的限制。

于 2008-08-28T15:17:29.990 回答
0

在 C(可能还有 C++)中,在计算 malloc 的缓冲区大小时,请务必记住使用 sizeof 运算符。这样,无论如何您都将编写更多可移植代码,这将自动考虑 64 位数据类型。

于 2008-08-28T15:18:23.013 回答
0

在大多数情况下,您唯一需要做的就是为两个平台编译代码。(这是假设您使用的是编译语言;如果不是,那么您可能不需要担心任何事情。)

我能想到的唯一可能导致问题的事情是假设数据类型的大小,这可能是您无论如何都不应该做的事情。当然,任何用汇编语言编写的东西都会引起问题。

于 2008-08-28T15:19:32.060 回答
0

请记住,许多编译器根据底层架构选择整数的大小,因为“int”应该是系统中最快的数字操纵器(根据一些理论)。

这就是为什么这么多程序员在他们最可移植的程序中使用 typedef 的原因——如果你想让你的代码在从 8 位处理器到 64 位处理器的所有东西上工作,你需要认识到,无论如何,在 C 中,int 没有严格定义。

指针是另一个需要小心的领域——如果你在摆弄指针的数值,不要使用 long、long long 或任何特定类型——使用正确的构造,不幸的是,它因编译器而异(这就是为什么您使用的每个编译器都有一个单独的 typedef.h 文件)。

——亚当·戴维斯

于 2008-08-28T15:27:08.203 回答