問題タブ [int128]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
1 に答える
4596 参照

c++ - LinuxforIntelコンパイラ上のint128

Linux 2.6.32

Intelコンパイラ:icpcバージョン13.0.1(gccバージョン4.4.6互換性)

出力:16

したがって、タイプ__uint128_tが存在します。
ただし、を使用すると__uint128_t、コンパイルエラーと実行エラーが発生します。

プログラム:

コンパイル:

icpc int01.cpp

/usr/include/c++/4.4.6/c++0x_warning.h(31):壊滅的なエラー:#errorディレクティブ:このファイルには、次のISOC++標準であるC++0xのコンパイラとライブラリのサポートが必要です。このサポートは現在実験段階であり、-std = c++0xまたは-std=gnu++0xコンパイラオプションを使用して有効にする必要があります。#errorこのファイルには、今後の\^のコンパイラとライブラリのサポートが必要です。

int01.cpp(コード4)のコンパイルが中止されました

icpc int01.cpp -std = c ++ 0x

int01.cpp(4):エラー:識別子"uint128_t"は未定義ですuint128_tval128 = 0; ^

int01.cpp(コード2)のコンパイルが中止されました

icpc int02.cpp -std = c ++ 0x

//エラーなし

icpc int03.cpp -std = c ++ 0x

int03.cpp(6):エラー:複数の演算子「<<」がこれらのオペランドに一致します:

int03.cpp(コード2)のコンパイルが中止されました

何か提案はありますか?

0 投票する
1 に答える
4342 参照

c - インテル C コンパイラーで +、-、*、/、および % をサポートする 128 ビット整数?

GCC と Clang には、128 ビット整数演算用の拡張機能__int128_tと拡張機能があります。__uint128_t

インテル C コンパイラーでも同様の結果が得られることを期待してい__m128iましたが、(可能であれば) を使用するに__m128iは、「組み込み」演算子を使用する代わりに、明示的な SSE2 関数呼び出しを作成する必要があるように見えます。 、、、、、のよう+に。-_ 私はこのようなことをしたいと思っていました(これはうまくいきません):*/%

+演算子, -, *,/で128 ビット整数がサポート%されているか、icc に埋め込まれていますか?

0 投票する
1 に答える
3426 参照

c - Clang の __int128_t のバグ?

この小さなコードは GCC と Clang の両方でコンパイルされますが、結果は異なります。

GCC では、これは意図した動作である 10 から 1 までカウントされますが、Clang では負の数にカウントし続けます。Clang を使用すると、次のように置き換えるtest--test-=1、期待どおりの動作が得られます。

__int128_t は GCC 拡張機能であるため、上記の結果は非標準 C にのみ適用されます。そのため、Clang では __int128_t は「自己責任で使用」することになるかもしれません。

これは Clang のバグですか、それとも表示されていない間違いを犯したのでしょうか?

編集: gcc (MacPorts gcc48 4.8-20130411_0) 4.8.1 20130411 (プレリリース) と Apple clang バージョン 4.0 (tags/Apple/clang-421.0.60) (LLVM 3.1svn ベース) を使用しています。

0 投票する
3 に答える
4242 参照

c - __int128_t 演算は、SSE を使用しても GCC によってエミュレートされますか?

__int128_tGCC が提供するような 128 ビットの整数データ型はエミュレートされているため、速度が遅いと聞いたことが あります。ただし、さまざまな SSE 命令セット (SSE、SSE2、...、AVX) が 128 ビット レジスタ用の少なくともいくつかの命令を導入したことは理解しています。私は SSE やアセンブリ / マシン コードについてあまり知らないので、__int128_t最新バージョンの GCC を使用して演算がエミュレートされているかどうかを誰かが説明してくれるかどうか疑問に思っていました。

__int128_t私がこれを尋ねている理由は、どの SSE 命令が利用されているかに応じて、GCC の異なるバージョン間でパフォーマンスに大きな違いを期待することが理にかなっているのかどうか疑問に思っているからです。

では、__int128_t算術演算のどの部分が GCC によってエミュレートされ、SSE 命令 (もしあれば) によってどの部分が実装されているのでしょうか?

0 投票する
1 に答える
3324 参照

python - ctypes での 128 ビット整数の処理

Python ctypes で 128 ビット整数 (現在は __uint128_t) をサポートする最良の方法は何ですか?

おそらく 2 つの uint64_t のユーザー定義の構造体ですが、これにより、必要な場所で位置合わせの問題が発生します。

ctypes が 128 ビット整数をサポートするように拡張されていない理由について何か考えはありますか?

0 投票する
1 に答える
643 参照

c++ - __int128 @ min 負の値の UDL (ユーザー定義リテラル) による整数オーバーフロー

わかりやすく簡単にするために、次の数字を次のように短縮します。

  • −170,141,183,460,469,231,731,687,303,715,884,105,728なので-170…728
  • 170,141,183,460,469,231,731,687,303,715,884,105,727なので170…727

これらの数値は、128 ビットの符号付き整数 ( の __int128 gcc) の最小値と最大値を表します。

gcc はこの型の定数を定義する方法を提供していないため、このデータ型のユーザー定義リテラル (生のリテラル) を実装しました: _u128forunsigned __int128および_i128for __int128

マイナス文字は UDL の一部ではありませんが、UDL の結果に適用される単項マイナス演算子です。

したがって、a -ddddd_i128(ここでdは数字) の場合、UDL は符号 __int128付きの正の値を計算しddddd、コンパイラはそれに単項マイナス演算子を適用します。ここまでは順調ですね。

問題は-170…128_i128(これは の有効な値である必要があります__int128) にあります:
UDLは の範囲外の符号付き __int128正数を計算し、未定義の動作 (符号付き整数のオーバーフロー) を引き起こします。170…128__int128

この数値定数を UDL で表す解決策はありますか?


私のUDLは宣言されています(今のところ、非constexprのループバージョンです)(生のリテラルです):

いくつかの使用法:


ビットシフト、数学演算など、さまざまな方法で定数を定義する方法があることは知っていますが-170…728、一貫した方法で作成できるようにしたいです。たとえば、この状況は望ましくありません。次を使用して任意の定数を作成できますを除いて-170…728_i128、この UDL に追加のトリックを使用する必要があります。

0 投票する
1 に答える
950 参照

android-ndk - Android NDK で __int128_t を使用する方法はありますか?

Android NDK で __int128_t を使用する方法はありますか?

GNU ツールチェーン 4.9 を使用しようとしましたが、どのように試しても次のエラーが発生します。 error: '__int128_t' was not declared in this scope

-std=gnu++11もちろん有効です。

0 投票する
3 に答える
8774 参照

c++ - IPv4/IPv6 アドレスを効率的に保存する方法

IPv4 と IPv6 の両方のネットワーク スタックを使用できるようにする C/C++ ネットワーク プロジェクトに取り組んでいます。プロジェクトは Linux でのみ動作します。そこで、IP アドレスを保存し、プロトコル ファミリを区別する効率的な方法を見つけようとしました。最初のアプローチは、労働組合を持つことでした。

2 番目のアプローチは、「typedef std::vector IPAddressNumber」を定義し、ベクターからのバイト数の後に違いを作ることでした。

3 番目のアプローチは、gcc から int128_t/uint128_t または __int128_t を使用することでした。

この最後のケースについて、これらのタイプがサポートされている GCC のバージョン、プラットフォーム (特に IA-32/IA-64)、および既知のバグがあるかどうかを知りたいです。また、上記の解決策のうち、最も便利なものはどれですか?