web-dev-qa-db-ja.com

なぜint128_tがないのですか?

多くのコンパイラーは128ビット整数型を提供しますが、私が使用したものはどれもtypedef int128_t。どうして?

私が思い出す限り、標準

  • 埋蔵量int128_t この目的のために
  • Typedefを提供するために、そのような型を提供する実装を奨励します
  • そのような実装はintmax_t少なくとも128ビット

(そして、実際にその最後の点に適合する実装を使用したとは思わない)

43
Hurkyl

C標準を参照します。 C++標準は<stdint.h>/<cstdint>の規則をCから継承していると思います。

一部のプラットフォームでは、gccが__int128およびunsigned __int128__int128は実装定義のキーワード)という名前で128ビットの符号付きおよび符号なし整数を実装することを知っています。

標準の128ビット型を提供する実装であっても、標準はrequireint128_tまたはuint128_tを定義しません。 N157 C標準のドラフトのセクション7.20.1.1を引用:

これらのタイプはオプションです。ただし、実装が8、16、32、または64ビットの幅、埋め込みビットなし、および2の補数表現を持つ整数型を提供する場合、対応するtypedef名を定義する必要があります。

Cは、実装が定義された拡張整数型を許可し、その名前は実装定義のキーワードです。 gccの__int128unsigned __int128は、標準で定義されている拡張整数型に非常に似ていますが、gccはそのように扱いません。代わりに、それらを言語拡張として扱います。

特に、__int128unsigned __int128拡張整数型である場合、gccはintmax_tを定義する必要があります。およびuintmax_t(これらのタイプとして(または少なくとも128ビット幅の一部のタイプとして)。そうしません。代わりに、intmax_tuintmax_tは64ビットのみです。

私の意見では、これは残念なことですが、gccが不適合になるとは思いません。移植可能なプログラムは、__int128の存在、または64ビットより広い整数型に依存できません。

24
Keith Thompson