web-dev-qa-db-ja.com

uint128_tはタイプに名前を付けません

CからC++にコードを移植しています。変換中に私が遭遇した:

uint128_tはタイプに名前を付けません

私のコンパイラ:gccバージョン5.2.1
私のオペレーティングシステム:Ubuntu 15.1

これはCとして問題なくコンパイルされ、stdint.hを含めることで解決すると思いましたが、そうではありませんでした。これまでのところ、このエラーに関する情報はあまりないようですので、他に何も試していません( example )。 uint128_tはこのプログラム全体で使用され、ビルドに不可欠です。したがって、それを削除することはできず、別の整数型を使用するかどうかはわかりません。

以下は、それがどこでどのように使用されるかの例です。

union {
    uint16_t  u16;
    uint32_t  u32;
    uint128_t u128;
} value;

uint128_tを定義しても大丈夫でしょうか、それともコンパイラを調べる必要がありますか?

12
Zimano

GCCには、タイプ ___int128_、_unsigned __int128_ 、___int128_t_、および___uint128_t_の組み込みサポートがあります(最後の2つは文書化されていません)。それらを使用して、独自のタイプを定義します。

_typedef __int128 int128_t;
typedef unsigned __int128 uint128_t;
_

または、__mode__(TI)を使用できます。

_typedef int int128_t __attribute__((mode(TI)));
typedef unsigned int uint128_t __attribute__((mode(TI)));
_

ドキュメント の引用:

TImode

「テトラ整数」(?)モードは16バイトの整数を表します。

16バイト= 16 * CHAR_BIT> = 128。

17

これはstdint.hを含めることで解決されると思いましたが、そうではありませんでした。

まあ、そうではないかもしれません。

まず、C++ 14の18.4.1章のC++ヘッダーcstdintを確認します。

namespace std {.....

typedef unsigned integer type uint8_t; // optional
typedef unsigned integer type uint16_t; // optional
typedef unsigned integer type uint32_t; // optional
typedef unsigned integer type uint64_t; // optional
.....

そして、

ヘッダーは、C標準の7.18と同じすべての関数、型、およびマクロを定義します。 [..]

次に、C11標準の§7.20.1.1の章を引用します(emphasis mine

  1. Typedef名uintN_tは、幅Nでパディングビットのない符号なし整数型を指定します。したがって、uint24_tは、正確に24ビットの幅を持つこのような符号なし整数型を示します。

  2. これらのタイプはオプションです。ただし、実装が8、16、32、または64ビットの幅、パディングビットなし、および(符号付きタイプの場合)2の補数表現を持つ整数タイプを提供する場合、対応するtypedef名を定義します。

そのため、ここで2つのことがわかります。

  1. 固定幅intsのサポートを提供するための実装は必須ではありません。

  2. 標準では、幅が64に制限されています。それ以上の幅を持つことは、再び標準では義務付けられていません。使用中の環境のドキュメントを確認する必要があります。

5
Sourav Ghosh

他の回答で指摘されているように、C++標準では、128ビット整数を使用可能にする必要はなく、uint128_tとして存在する場合でもtypedefedする必要はありません。コンパイラー/アーキテクチャーが128ビット整数をサポートしておらず、それらが必要な場合は、boostを使用してそれらをエミュレートできます。

http://www.boost.org/doc/libs/1_58_0/libs/multiprecision/doc/html/boost_multiprecision/tut/ints/cpp_int.html

ブーストライブラリは、使用可能な場合、ネイティブタイプを自動的に使用すると思います

2
pqnet