多くのコンパイラーは128ビット整数型を提供しますが、私が使用したものはどれもtypedef int128_t
。どうして?
私が思い出す限り、標準
int128_t
この目的のためにintmax_t
少なくとも128ビット(そして、実際にその最後の点に適合する実装を使用したとは思わない)
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の__int128
とunsigned __int128
は、標準で定義されている拡張整数型に非常に似ていますが、gccはそのように扱いません。代わりに、それらを言語拡張として扱います。
特に、__int128
とunsigned __int128
が拡張整数型である場合、gccはintmax_t
を定義する必要があります。およびuintmax_t
(これらのタイプとして(または少なくとも128ビット幅の一部のタイプとして)。そうしません。代わりに、intmax_t
とuintmax_t
は64ビットのみです。
私の意見では、これは残念なことですが、gccが不適合になるとは思いません。移植可能なプログラムは、__int128
の存在、または64ビットより広い整数型に依存できません。