是否准确地说,如果您正在编写可移植的C,则可用的最长的无符号整数类型是unsigned long long
?我不是在寻找特定位数,甚至不是“至少特定位数”,而是“当前编译器和目标平台支持的最长位数,无论可能发生什么”。
答案 0 :(得分:8)
是否准确地说,如果您正在编写可移植的C,则可用的最长的无符号整数类型是
unsigned long long
?我不是在寻找特定位数,甚至不是“至少特定位数”,而是“当前编译器和目标平台支持的最长位数,无论可能发生什么”。
不。既不针对C89,也不针对C99 +。 C89根本不支持unsigned long long
,因此您受困于unsigned long
。因此,如果您想支持古老的平台,则不能使用它。
然后C99添加了uintmax_t
typedef(也包括intmax_t
),它的 可以大于unsigned long long
。自然,uintmax_t
的范围必须至少为{em> unsigned long long
。
7.18.1.5最大宽度整数类型
1以下类型指定了一个有符号整数类型,它可以 表示任何有符号整数类型的任何值:
intmax_t
以下类型指定了一个无符号整数类型,它可以 表示任何无符号整数类型的任何值:
uintmax_t
这些类型是必需的。
这可能是实现定义的扩展整数类型(例如,GCC不支持扩展整数类型),但是您不需要了解它;或者,如果将来的标准实现了unsigned superduper long long
,那么将来的实现uintmax_t
可能就是该类型的定义。
如果您确实需要支持各种编译器,则可以使用一些技巧来将typedef创建为最大的可移植类型,如下所示:
#include <limits.h>
#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
/* C99+ */
#include <stdint.h>
typedef uintmax_t mymaxuint;
#define MYMAXUINT_MAX UINTMAX_MAX
#elif defined(ULLONG_MAX)
/* Some compiler that does not support C99+ but seems to have
a macro for unsigned long long for some reason */
typedef unsigned long long mymaxuint;
#define MYMAXUINT_MAX ULLONG_MAX
#else
typedef unsigned long mymaxuint;
#define MYMAXUINT_MAX ULONG_MAX
#endif
答案 1 :(得分:0)
取决于C
标准,编译器为supporting。
例如,unsigned long long
是C99
的一部分,并且不保证支持早期C
标准的编译器拥有它。
我不知道在新的standards上有比long long
大的东西。
对于较早的标准,unsigned long
是自C89
起最大的标准。
正如@AnttiHaapala的answer和Wikipedia(我在prior编辑中也提到)指出的那样,C99标准为您提供:
TYPE | MIN VALUE | MAX VALUE
----------+------------+------------
intmax_t | INTMAX_MIN | INTMAX_MAX
uintmax_t | 0 | UINTMAX_MAX
其中提供:
最大宽度整数类型,保证是实现中最大的整数类型。