声明在任何平台上始终为4字节的整数类型的最佳方法是什么?我不用担心某些具有16位的设备或旧机器int
。
声明在任何平台上始终为4字节的整数类型的最佳方法是什么?我不用担心某些具有16位的设备或旧机器int
。
Answers:
#include <stdint.h>
int32_t my_32bit_int;
<inttypes.h>
”已明确记录为包括标头“ <stdint.h>
”(这对于C标头并不常见),但是“ <inttypes.h>
”标头在“ <stdint.h>
”不可用的情况下可用,并且可能是可移植性的更好选择。在“ <stdint.h>
”头是标准委员会的一项发明,并创造了让独立的C(相对于托管的实现-正常的)的实现只需要支持“ <stdint.h>
”并不见得“ <inttypes.h>
”太(这也意味着支持' <stdio.h>
,否则就没有必要)。
uint32_t
。
在我看来,Corey的答案是“最佳”的正确答案,但实际上,一个简单的“ int”也可以使用(假设您忽略了16位int的系统)。在这一点上,太多的代码取决于int是32位的,因此系统供应商不会更改它。
(另请参见为什么在许多64位系统上long是32位以及为什么我们有“ long long”。)
但是,使用int32_t的好处之一是您不会使这个问题永久存在!
您需要包含inttypes.h
而不是,stdint.h
因为stdint.h
在某些平台(例如Solaris)上不可用,而在Linux等系统inttypes.h
上将包含stdint.h
您。如果包含它,inttypes.h
则代码在Linux和Solaris之间更易于移植。
该链接解释了我在说什么: HP关于inttypes.h的链接
并且此链接具有一个表,该表显示了为什么不使用long
或int
如果您打算在数据类型中存在一定数量的位。
关于可移植数据类型的IBM链接
stdint.h是显而易见的选择,但不一定可用。
如果您使用的是可移植库,则可能已经提供了可移植的固定宽度整数。例如,SDL具有Sint32
(S代表“符号”),而GLib具有gint32
。
使用<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