我有一个 C 程序,我知道它可以在 32 位系统上运行。在 64 位系统(至少我的)上,它工作到一个点然后停止。阅读一些论坛的程序可能不是 64 位安全的?我认为这与 32 位和 64 位系统之间的数据类型差异有关。
两者都一样吗char
?int
或者long
它们的unsigned
变体呢?32 位程序是否有任何其他方式不会是 64 位安全的?如果我想验证应用程序是 64 位安全的,我应该采取哪些步骤?
我有一个 C 程序,我知道它可以在 32 位系统上运行。在 64 位系统(至少我的)上,它工作到一个点然后停止。阅读一些论坛的程序可能不是 64 位安全的?我认为这与 32 位和 64 位系统之间的数据类型差异有关。
两者都一样吗char
?int
或者long
它们的unsigned
变体呢?32 位程序是否有任何其他方式不会是 64 位安全的?如果我想验证应用程序是 64 位安全的,我应该采取哪些步骤?
C 中的常规数据类型具有最小的值范围,而不是特定的位宽。例如,ashort
必须至少能够表示 -32767 到 32767(含)。
所以,是的,如果你的代码依赖于环绕在 32768 的值,那么如果 short 是一些大喇叭的 128 位庞然大物,它就不太可能表现良好。
如果您想要特定宽度的数据类型,请查看stdint.h
诸如此类int64_t
的内容。有多种选择,具体宽度,“至少”宽度等等。与“常规”整数类型不同,它们还要求对这些进行补码:
例如,来自C11 7.20.1.1 Exact-width integer types
:
typedef 名称 intN_t 指定宽度为 N、无填充位和二进制补码表示的有符号整数类型。因此, int8_t 表示这种宽度正好为 8 位的有符号整数类型。
如果您遵守规则(例如不将指针转换为整数),您的代码应该可以在任何实现和任何架构上编译和运行。
如果没有,您只需开始调试,然后在专门讨论此类问题的论坛站点上发布似乎导致问题的详细信息和代码。现在我最近在哪里见过其中之一?:-)