关于可移植性:如何在C中声明32位整数

How to Declare a 32-bit Integer in C

在任何平台上声明始终为4字节的整数类型的最佳方法是什么?我不担心某些设备或旧机器有16位int


1
2
3
#include <stdint.h>

int32_t my_32bit_int;


C不太关心整数类型的确切大小,C99引入了头stdint.h,这可能是您最好的选择。包括这些,您可以使用,例如int32_t。当然,并非所有平台都支持这一点。


在我看来,科里的答案是"最佳"的,但是一个简单的"int"在实践中也会起作用(假设你忽略了16位int的系统)。在这一点上,如此多的代码依赖于32位的int,以至于系统供应商不会更改它。

(另请参见为什么long在许多64位系统上是32位的,以及为什么我们有"long long"。)

不过,使用Int32的好处之一是,您不会使这个问题长期存在!


您需要包括inttypes.h而不是stdint.h,因为stdint.h在某些平台(如Solaris)上不可用,并且inttypes.h将包括stdint.h在Linux等系统上。如果您包含inttypes.h,那么您的代码在Linux和Solaris之间更易于移植。

这个链接解释了我的意思:关于inttypes.h的HP链接

这个链接有一个表,显示了如果您打算在您的数据类型中存在一定数量的位,为什么您不想使用longint。关于可移植数据类型的IBM链接


如果你没有stdint.h,你可以找一份布莱恩·格拉德曼的brg_types.h的拷贝。

brg_types.h将发现平台上各种整数的大小,并为常见大小(8、16、32和64位)创建typedef。


C99或更高版本

使用

如果您的实现支持2的补码32位整数,那么它必须定义int32_t

如果不是这样,那么下一个最好的方法是int_least32_t,它是由至少32位的实现所支持的整数类型,而不管表示(两个补码、一个补码等)。

还有一个int_fast32_t,它是一个至少32位宽的整数类型,其选择的目的是允许对该大小要求进行最快的操作。

美国国家标准委员会

您可以使用long,由于标准规定的最小范围要求,保证至少32位宽。

如果您希望使用最小的整数类型来适应32位的数字,那么您可以使用如下的预处理器语句和中定义的宏:

1
2
3
4
5
6
7
8
9
10
11
12
13
#define TARGET_MAX 2147483647L

#if   SCHAR_MAX >= TARGET_MAX
  typedef signed char int32;
#elif SHORT_MAX >= TARGET_MAX
  typedef short int32;
#elif INT_MAX   >= TARGET_MAX
  typedef int int32;
#else
  typedef long int32;
#endif

#undef TARGET_MAX


stdint.h是显而易见的选择,但它不一定可用。

如果您使用的是可移植库,它可能已经提供了可移植的固定宽度整数。例如,sdl有Sint32(s代表"signed"),glib有gint32


此外,根据您的目标平台,您可以为构建系统使用自动工具

它将查看stdint.h/inttypes.h是否存在,如果不存在,将在"config.h"中创建适当的typedef。


如果stdint.h不适用于您的系统,请创建您自己的系统。我总是有一个名为"types.h"的文件,其中包含所有有符号/无符号8、16和32位值的typedef。