在任何平台上声明始终为 4 字节的整数类型的最佳方法是什么?我不担心具有 16-bit 的某些设备或旧机器int
。
10 回答
#include <stdint.h>
int32_t my_32bit_int;
C 本身不太关心整数类型的确切大小,C99 引入了头文件stdint.h,这可能是你最好的选择。包括它,您可以使用例如int32_t
. 当然,并非所有平台都支持这一点。
在我看来,Corey 的回答对于“最佳”是正确的,但一个简单的“int”在实践中也可以使用(假设您忽略了具有 16 位 int 的系统)。在这一点上,很多代码都依赖于 int 是 32 位系统供应商不会改变它。
(另请参阅为什么在许多 64 位系统上 long 是 32 位以及为什么我们有“long long”。)
但是,使用 int32_t 的好处之一是您不会使这个问题长期存在!
brg_types.h
如果您没有stdint.h
.
brg_types.h
将发现平台上各种整数的大小,并为常见大小创建 typedef:8、16、32 和 64 位。
您需要包含inttypes.h
而不是stdint.h
因为stdint.h
在 Solaris 等某些平台上不可用,并且inttypes.h
会stdint.h
在 Linux 等系统上为您包含。如果包含inttypes.h
,那么您的代码在 Linux 和 Solaris 之间更可移植。
这个链接解释了我在说什么: 关于 inttypes.h 的 HP 链接
此链接有一个表格,显示您不想使用的原因,long
或者int
您是否打算在数据类型中存在一定数量的位。
关于可移植数据类型的 IBM 链接
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
如果 stdint.h 不适用于您的系统,请自己制作。我总是有一个名为“types.h”的文件,其中包含所有有符号/无符号 8、16 和 32 位值的 typedef。
还取决于您的目标平台,您可以将自动工具用于构建系统
它将查看 stdint.h/inttypes.h 是否存在,如果不存在,将在“config.h”中创建适当的 typedef
stdint.h 是显而易见的选择,但不一定可用。
如果您使用的是可移植库,它可能已经提供了可移植的固定宽度整数。例如,SDL 有Sint32
(S 表示“签名”),而 GLib 有gint32
.
您可以使用有符号或无符号长声明 32 位。
int32_t variable_name;
uint32_t variable_name;