为什么没有int128_t?

问题描述 投票:0回答:1

许多编译器都提供 128 位整数类型,但我使用过的编译器都不提供 typedef

int128_t
。为什么?

据我记得,标准

  • 为此目的预留
    int128_t
  • 鼓励提供此类类型的实现提供 typedef
  • 要求此类实现提供至少 128 位的
    intmax_t

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

c++ c std c-standard-library
1个回答
35
投票

我会参考C标准;我认为 C++ 标准继承了 C 的

<stdint.h>
/
<cstdint>
的规则。

我知道 gcc 实现了 128 位有符号和无符号整数,在某些平台上具有名称

__int128
unsigned __int128
__int128
是实现定义的关键字)。

即使对于提供标准 128 位类型的实现,该标准也不需要定义 需要

int128_t
uint128_t
。引用C标准N1570草案第7.20.1.1节:

这些类型是可选的。但是,如果实现提供 宽度为 8、16、32 或 64 位的整数类型,无填充位, 和(对于有符号类型)具有二进制补码 表示,它应定义相应的 typedef 名称。

C23 确实要求尽可能提供这些类型。引用N3096标准草案,7.22.2.1:

如果实现提供标准或扩展整数类型 具有特定的宽度并且没有填充位,它应定义 相应的 typedef 名称。

(这适用于精确宽度类型。C23 不再允许除二进制补码之外的有符号整数表示形式。)

C 允许实现定义的“扩展整数类型”,其名称是实现定义的关键字。 gcc 的 __int128

unsigned __int128
与标准定义的扩展整数类型非常相似——但 gcc 并不这样对待它们。相反,它将它们视为语言扩展。
特别是,如果 

__int128

unsigned __int128
扩展整数类型
,则需要 gcc 将 intmax_t
uintmax_t
定义为这些类型(或某些至少 128 位宽的类型)。但事实并非如此;相反,
intmax_t
uintmax_t
只有 64 位。它还必须支持这些类型的常量。
在我看来,这是不幸的,但我不认为这会使 gcc 不合格。任何可移植程序都不能依赖于 

__int128

的存在,或任何大于 64 位的整数类型。并且更改

intmax_t
uintmax_t
会导致严重的 ABI 兼容性问题。
    

© www.soinside.com 2019 - 2024. All rights reserved.