【问题标题】:Why isn't there int128_t?为什么没有int128_t?
【发布时间】:2015-06-20 17:38:15
【问题描述】:

许多编译器提供 128 位整数类型,但我使用过的编译器都没有提供 typedef int128_t。为什么?

据我所知,标准

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

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

【问题讨论】:

  • 标准无处要求必须将__int128 视为“扩展整数类型”。
  • 您使用哪种语言?我很确定 C++ 标准没有说 intmax_t 至少应为 128 位长,我怀疑 C 标准也有。
  • @Hurkyl:是的,实现提供了一个名为__int128 的东西,其行为类似于一个整数,但这并不意味着在intmax_t 关心的意义上它是“真的”关于。另一方面,如果实现提供了int128_t那么 intmax_t 必须至少有那么大。因此,一种可能的解释是,当禁用特定于编译器的扩展时,实现不希望 intmax_t 类型发生变化,但我不知道这是否是真正的原因。
  • 如果编译器提供了扩展的整数类型,那么intmax_t(或uintmax_t,视情况而定)必须能够表示它。但是编译器也可以提供一种不是扩展整数类型但行为类似于整数类型的类型。并且更改 intmax_t 的内容会破坏 ABI,因此实际上没有编译器将 __int128 视为扩展整数类型。
  • @T.C.:很不幸。在我看来,它违背了intmax_t 的目的。 C 代码不应该依赖于它具有特定的宽度。

标签: c++ c c++-standard-library c-standard-library


【解决方案1】:

我会参考 C 标准;我认为 C++ 标准从 C 继承了 <stdint.h> / <cstdint> 的规则。

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

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

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

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

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

在我看来,这很不幸,但我不相信它会使 gcc 不合格。任何可移植程序都不能依赖于__int128 的存在,或者任何大于64 位的整数类型。并且更改intmax_tuintmax_t 会导致严重的ABI 兼容性问题。

【讨论】:

  • 加上我的两分钱,__int128 被提到是子条款J.5.6(其他算术类型),因此它可能被视为编译器的扩展。这收敛于GCC's documentation,即:GCC does not support any extended integer types.
  • @GrzegorzSzpetkowski:这是对 C90 中类似句子的改写:“其他算术类型,例如 long long int,以及它们的适当转换已定义”;它早于 C99 和扩展整数类型的引入。 (它在“可移植性问题”附录的“通用扩展”部分。)我觉得奇怪的是标准和 gcc 都支持添加新整数类型的扩展,但不使用“扩展整数类型”机制。
  • 我相信标准委员会将选择权交给了实施者。这将收敛到其他“松散”,例如可选的 VLA。
  • 它是一个添加128位类型的编译器来扩展intmax_t,那么任何使用该类型并且在类型扩展之后编译的代码将无法与之前编译的代码链接类型被扩展。在许多情况下,能够将新代码与可能已在多年前编译的旧代码正确链接非常重要,并且这些代码可能并不总是可用。
  • @supercat:遵循标准的要求也很重要,它说明了intmax_t 是什么。
猜你喜欢
  • 2018-01-18
  • 1970-01-01
  • 1970-01-01
  • 2011-11-24
  • 2010-12-10
  • 2014-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多