如何在C中声明32位整数

时间:2009-08-04 18:30:26

标签: c portability

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

10 个答案:

答案 0 :(得分:103)

#include <stdint.h>

int32_t my_32bit_int;

答案 1 :(得分:12)

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

答案 2 :(得分:11)

在我看来,Corey的答案对于“最佳”是正确的,但是一个简单的“int”也将在实践中起作用(假设您忽略了具有16位int的系统)。此时,如此多的代码依赖于int为32位,系统供应商不会改变它。

(另请参阅为什么很长的64位系统为32位,为什么我们有“长期”。)

使用int32_t的一个好处是,你不会让这个问题长期存在!

答案 3 :(得分:5)

如果你没有brg_types.h,你可以追查Brian Gladman stdint.h的副本。

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

答案 4 :(得分:5)

您需要包含inttypes.h而不是stdint.h,因为某些平台(如Solaris)上不提供stdint.h,而inttypes.h将包含stdint.h在诸如Linux之类的系统上。 如果包含inttypes.h,那么您的代码在Linux和Solaris之间更容易移植。

这个链接解释了我在说什么: HP link about inttypes.h

此链接有一个表格,说明如果您的数据类型中存在特定位数的意图,则不希望使用longint的原因。 IBM link about portable data types

答案 5 :(得分:0)

如果您的系统无法使用stdint.h,请自行创建。我总是有一个名为“types.h”的文件,它具有所有有符号/无符号8,16和32位值的typedef。

答案 6 :(得分:0)

还取决于您的目标平台,您可以使用autotools构建系统

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

答案 7 :(得分:0)

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

如果您使用的是可移植库,则可能已经提供了可移植的固定宽度整数。 例如,SDL有Sint32(S代表“签名”),而GLib有gint32

答案 8 :(得分:0)

C99或更高版本

使用<stdint.h>

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

如果没有那么下一个最好的东西是int_least32_t,这是一个至少32位的实现支持的整数类型,无论表示形式如何(二进制补码,一个补码等)。

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

ANSI C

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

如果您希望使用最小的整数类型来匹配32位数,那么您可以使用<limits.h>中定义的宏之类的预处理器语句:

#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

答案 9 :(得分:0)

你可以用signed或unsigned long声明32位。

int32_t variable_name;
uint32_t variable_name;