为什么没有 int128_t?

Why isn't there int128_t?

许多编译器提供 128 位整数类型,但我使用的 none 提供了类型定义 int128_t。为什么?

据我所知,标准

(而且,我不相信我使用的实现实际上符合最后一点)

我会参考C标准;我认为 C++ 标准从 C.

继承了 <stdint.h> / <cstdint> 的规则

我知道 gcc 在某些平台上实现了 128 位有符号和无符号整数,名称为 __int128unsigned __int128__int128 是实现定义的关键字)。

即使对于提供标准 128 位类型的实现,该标准也不要求 int128_tuint128_t 被定义。引用 C 标准草案 N1570 第 7.20.1.1 节:

These types are optional. However, if an implementation provides integer types with widths of 8, 16, 32, or 64 bits, no padding bits, and (for the signed types) that have a two’s complement representation, it shall define the corresponding typedef names.

C 允许实现定义的扩展整数类型,其名称是实现定义的关键字。 gcc 的 __int128unsigned __int128 与标准定义的扩展整数类型非常相似——但 gcc 不那样对待它们。相反,它将它们视为语言扩展。

特别是,如果 __int128unsigned __int128 扩展整数类型 ,则需要 gcc 定义 intmax_tuintmax_t 作为那些类型(或作为至少 128 位宽的某些类型)。它没有这样做;相反,intmax_tuintmax_t 只有 64 位。

在我看来,这是不幸的,但我不认为这会使 gcc 不符合规范。任何可移植程序都不能依赖于 __int128 的存在或任何大于 64 位的整数类型。更改 intmax_tuintmax_t 会导致严重的 ABI 兼容性问题。