83

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

4

10 回答 10

119
#include <stdint.h>

int32_t my_32bit_int;
于 2009-08-04T18:33:55.560 回答
14

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

于 2009-08-04T18:35:19.037 回答
12

在我看来,Corey 的回答对于“最佳”是正确的,但一个简单的“int”在实践中也可以使用(假设您忽略了具有 16 位 int 的系统)。在这一点上,很多代码都依赖于 int 是 32 位系统供应商不会改变它。

(另请参阅为什么在许多 64 位系统上 long 是 32 位以及为什么我们有“long long”。)

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

于 2009-08-04T18:38:28.547 回答
5

brg_types.h如果您没有stdint.h.

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

于 2009-08-04T19:48:30.700 回答
5

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

这个链接解释了我在说什么: 关于 inttypes.h 的 HP 链接

此链接有一个表格,显示您不想使用的原因,long或者int您是否打算在数据类型中存在一定数量的位。 关于可移植数据类型的 IBM 链接

于 2012-05-03T18:53:49.087 回答
3

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
于 2018-06-17T02:55:08.603 回答
1

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

于 2009-08-04T19:12:21.490 回答
0

还取决于您的目标平台,您可以将自动工具用于构建系统

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

于 2009-08-04T19:21:46.447 回答
0

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

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

于 2009-08-04T20:29:14.157 回答
0

您可以使用有符号或无符号长声明 32 位。

int32_t variable_name;
uint32_t variable_name;
于 2021-04-12T09:47:24.473 回答