不同位大小的 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 是否相同? intlong 或它们的 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 上的数据类型之间是不是存在差异?的主要内容,如果未能解决你的问题,请参考以下文章

golang 不同类型之间计算的精度问题怎么解决

词类标签 POS tagging

32位64位下各种数据类型大小的对比

keil宏定义数值大小问题

“字节”数据类型大小 = 1 字节,而它可以有 3 位数字?

对于所有数据类型,所有数据指针在一个平台上的大小是不是相同? [复制]