在任何平台上声明一个总是4字节的整数类型的最佳方法是什么?我不担心具有16位int
的某些设备或旧机器。
答案 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
此链接有一个表格,说明如果您的数据类型中存在特定位数的意图,则不希望使用long
或int
的原因。
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)
使用<stdint.h>
。
如果您的实现支持2的补码32位整数,那么它必须定义int32_t
。
如果没有那么下一个最好的东西是int_least32_t
,这是一个至少32位的实现支持的整数类型,无论表示形式如何(二进制补码,一个补码等)。
还有int_fast32_t
这是一个至少32位宽的整数类型,选择的目的是允许对该大小要求进行最快的操作。
您可以使用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;