c - 如何在 64 位系统上限制变量类型(如 long int)的大小?



所以,32位系统上的long int是32位,64位系统上是64位。现在,我正在 32 位系统上编写代码,没有处理溢出。如果我在 64 位系统上运行相同的代码,我所有的长变量将不必要地占用两倍的内存大小,这是一种浪费。那么如何限制64位系统上的变量大小。

例如,我有一个变量长长整 int 计数。现在,Count 在我的设计中最多可以容纳 63 位值。如果我在 64 位系统上运行相同的代码,Count 将是 128 位,但根据逻辑,剩余的 64 位将被浪费。所以,我想确保 Count 在 64 位系统上也只占用 64 位

因此,32 位系统上的 long int 是 32 位,64 位系统上的 long int 是 64 位。

不一定。它们可能是 64 位。或者它们可能是 32 位。

那么如何限制64位系统上的变量大小。

不要使用 C 中的原始默认类型,例如long,您应该使用 stdint.h 中的int32_t。与long不同,它是完全可移植的,并且具有确定的大小。

"普通"积分类型的实际大小取决于平台,但您可以使用精确宽度的积分类型,如int32_tint64_t。让我们详细说明一下标准对整数类型大小的规定(例如,参见这个在线 c 标准草案):

首先,关于整型,该标准允许编译器自由考虑底层架构:

6.2.5 类型 (5) ..."plain"int 对象具有执行环境体系结构建议的自然大小(大 足以包含定义INT_MIN INT_MAX范围内的任何值 在标题中)。

该标准仅为五种标准有符号整数类型中的每一种指定"最小"大小,即有符号字符、短整型、整型、长整型和长整型。

5.2.4.2.1 整数类型的大小 (1) 下列值应改为适合于 #if 预处理指令。此外,除了CHAR_BIT和 MB_LEN_MAX,以下内容应替换为具有以下特征的表述: 与作为 根据整数促销转换的相应类型。 它们的实现定义值应等于或大于 所显示的幅度(绝对值),具有相同的符号。

但该标准还定义了精确宽度的整数类型:

7.20.1.1 精确宽度整数类型

(1) typedef 名称intN_t指定一个有符号整数类型,宽度为 N,没有填充位,并且 二的补码表示。因此,int8_t表示这样的签名 宽度正好为 8 位的整数类型。

(2) 类型定义名称 uintN_t 指定宽度为 N 且无的无符号整数类型 填充位。因此,uint24_t表示这样的无符号整数类型 宽度正好为 24 位。

(3) 这些类型是可选的。然而 如果实现提供的整数类型宽度为 8、16、32, 或 64 位,无填充位,并且(对于有符号类型)具有 二的补码表示,它应定义相应的 类型定义名称。

虽然声明这些类型是"可选的",但也说如果实现提供了特定大小/行为的整数类型,它应该定义相应的 typedef 名称。因此,可以推导出编译器可能决定不提供具有定义宽度的基本整数类型,但如果它提供,那么相应的精确宽度类型也将可用。