[解決済み] (A + B + C) ≠ (A + C + B)とコンパイラの並べ替え
2022-11-03 23:54:47
疑問点
2つの32ビット整数を足すと、整数のオーバーフローが発生することがあります。
uint64_t u64_z = u32_x + u32_y;
このオーバーフローは、32ビット整数の1つが最初に64ビット整数にキャストまたは加算された場合に回避することができます。
uint64_t u64_z = u32_x + u64_a + u32_y;
しかし、コンパイラが足し算の順序を変更することにした場合。
uint64_t u64_z = u32_x + u32_y + u64_a;
の場合、整数のオーバーフローが発生する可能性があります。
コンパイラはこのような並べ替えをすることが許されるのでしょうか、それとも結果の矛盾に気づいて式の順序をそのままにしてくれることを信じていいのでしょうか。
どのように解決するのですか?
オプティマイザがそのような並べ替えを行ったとしても、C言語の仕様に縛られているので、そのような並べ替えは、次のようになります。
uint64_t u64_z = (uint64_t)u32_x + (uint64_t)u32_y + u64_a;
根拠を示す。
で始める。
uint64_t u64_z = u32_x + u64_a + u32_y;
足し算は左から右へ行う。
整数昇格ルールでは、元の式における最初の足し算で
u32_x
に昇格します。
uint64_t
. 2回目の追加では
u32_y
も昇格して
uint64_t
.
したがって、C言語仕様に準拠するためには、どのオプティマイザも
u32_x
と
u32_y
を64ビットの符号なし値に変換します。これはキャストを追加することと同じです。(実際の最適化はCレベルでは行われませんが、私たちが理解できる記法なのでC記法を使用しています)。
関連
-
[解決済み】C-stringを使用すると警告が表示される。"ローカル変数に関連するスタックメモリのアドレスが返される"
-
[解決済み】「std::operator」で「operator<<」にマッチするものがない。
-
[解決済み】オブジェクト引数のない非静的メンバ関数の呼び出し コンパイラーエラー
-
[解決済み] 非静的データメンバの無効な使用
-
[解決済み] 数値定数の前にunqualified-idを付けて、数値を定義することを期待する。
-
[解決済み] SQLiteのINSERT/per-secondのパフォーマンスを向上させる
-
[解決済み] 1ビットのセット、クリア、トグルはどのように行うのですか?
-
[解決済み] static_cast, dynamic_cast, const_cast, reinterpret_cast はいつ使うべきですか?
-
[解決済み] const int*、const int * const、int const *の違いは何ですか?
-
[解決済み】C++で(-2147483648> 0)がtrueを返す?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】C++でユーザー入力を待つ【重複あり
-
[解決済み】C++コンパイルタイムエラー:数値定数の前に期待される識別子
-
[解決済み】 != と =! の違いと例(C++の場合)
-
[解決済み】IntelliSense:オブジェクトに、メンバー関数と互換性のない型修飾子がある
-
[解決済み】fpermissiveフラグは何をするのですか?
-
[解決済み】「std::operator」で「operator<<」にマッチするものがない。
-
[解決済み】エラー。switchステートメントでcaseラベルにジャンプする
-
[解決済み】クラステンプレートの使用にはテンプレート引数リストが必要です
-
[解決済み】C++ - ステートメントがオーバーロードされた関数のアドレスを解決できない。
-
[解決済み] 変数サイズのオブジェクトが初期化されないことがある c++