gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 05:15:55 25 4
gpt4 key购买 nike

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

最佳答案

Is it accurate to say that, if you are writing portable C, the longest available unsigned integer type is unsigned long long? I'm not looking for a specific number of bits, or even 'at least a specific number of bits', but 'the longest supported by the current compiler and target platform, whatever that may happen to be'.

没有。无论是针对 C89 还是针对 C99+。 C89 根本不支持 unsigned long long,因此您只能使用 unsigned long。因此,如果您想支持过时的平台,则不能使用它。

并且 C99 添加了 uintmax_t typedef(还有 intmax_t)可以大于unsigned long longuintmax_t 的范围必须至少 unsigned long long

C99 7.18.1.5 :

7.18.1.5 Greatest-width integer types

1 The following type designates a signed integer type capable of representing any value of any signed integer type:

intmax_t

The following type designates an unsigned integer type capable of representing any value of any unsigned integer type:

uintmax_t

These types are required.

这可能是实现定义的扩展整数类型(例如 GCC 不支持扩展整数类型),但不需要知道它;或者,如果 future 的标准实现了 unsigned superduper long long,那么在未来的实现中,uintmax_t 可能是它的 typedef。


如果你真的需要支持各种编译器,你可以使用一些技巧来为最大的可移植类型创建一个 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

关于c - 最长可移植无符号整数类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57269034/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com