不同位大小的 POS 上的数据类型之间是不是存在差异?
Posted
技术标签:
【中文标题】不同位大小的 POS 上的数据类型之间是不是存在差异?【英文标题】:Is there a difference between datatypes on different bit-size OSes?不同位大小的 POS 上的数据类型之间是否存在差异? 【发布时间】:2012-04-18 20:04:19 【问题描述】:我有一个 C 程序,我知道它可以在 32 位系统上运行。在 64 位系统上(至少我的)它工作到一定程度然后停止。阅读一些论坛的程序可能不是 64 位安全的?我认为这与 32 位和 64 位系统之间的数据类型差异有关。
两者的char
是否相同? int
或 long
或它们的 unsigned
变体呢? 32 位程序是否有任何其他方式不会是 64 位安全的?如果我想验证应用程序是 64 位安全的,我应该采取哪些步骤?
【问题讨论】:
显而易见的是,指针的大小不同。 @MikeKwan 所以char *data
会与两者不同吗?我怎样才能让它在 64 位和 32 位上一样工作。或者这最终应该重要吗?
【参考方案1】:
C 中的常规数据类型具有最小的取值范围,而不是特定的位宽。例如,short
必须能够至少表示 -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 位。
如果您遵守规则(例如不将指针转换为整数),您的代码应该可以在任何实现和任何架构上编译和运行。
如果没有,您只需开始调试,然后在专门讨论此类问题的论坛网站上发布似乎导致问题的详细信息和代码。现在我最近在哪里见过其中之一? :-)
【讨论】:
以上是关于不同位大小的 POS 上的数据类型之间是不是存在差异?的主要内容,如果未能解决你的问题,请参考以下文章