最长的可移植无符号整数类型

时间:2019-07-30 09:58:24

标签: c

是否准确地说,如果您正在编写可移植的C,则可用的最长的无符号整数类型是unsigned long long?我不是在寻找特定位数,甚至不是“至少特定位数”,而是“当前编译器和目标平台支持的最长位数,无论可能发生什么”。

2 个答案:

答案 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

C99 7.18.1.5

  

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 longC99的一部分,并且不保证支持早期C标准的编译器拥有它。 我不知道在新的standards上有比long long大的东西。 对于较早的标准,unsigned long是自C89起最大的标准。


编辑

正如@AnttiHaapala的answerWikipedia(我在prior编辑中也提到)指出的那样,C99标准为您提供:

TYPE      | MIN VALUE  | MAX VALUE
----------+------------+------------
intmax_t  | INTMAX_MIN | INTMAX_MAX
uintmax_t | 0          | UINTMAX_MAX

其中提供:

  

最大宽度整数类型,保证是实现中最大的整数类型。