[解決済み] 符号なし整数の減算は定義された動作ですか?
質問
結果が負になるとき、同じ型の別の整数から符号なし整数を引くことに問題があると信じているような人のコードに出会いました。そのため、このようなコードは、ほとんどのアーキテクチャで動作するとしても、不正確なものになります。
unsigned int To, Tf;
To = getcounter();
while (1) {
Tf = getcounter();
if ((Tf-To) >= TIME_LIMIT) {
break;
}
}
これは、私が見つけた C 標準からの唯一漠然とした関連性のある引用です。
符号なしオペランドを含む計算がオーバーフローすることはありません。 なぜなら、結果の符号なし整数型によって表現できない結果は、その数だけ減少するからです。 型が表現できない結果は、結果の型が表現できる最大の値より1つ大きい数で減数されるからです。 で表現できない結果は、結果の型によって表現できる最大の値より 1 つ大きい数で減速されるからです。
私は、右のオペランドがより大きいとき、演算はモジュロ切り捨てられた数のコンテキストで意味を持つように調整されるという意味で、この引用を取ることができると思います。
すなわち
0x0000 - 0x0001 == 0x 1 0000 - 0x0001 == 0xFFFF
実装に依存した符号付きセマンティクスを使用するのとは対照的に
0x0000 - 0x0001 == (unsigned)(0 + -1) == (0xFFFF だけでなく 0xFFFE や 0x8001 も)
どの、どのような解釈が正しいのでしょうか?それは全く定義されていないのですか?
どのように解決するのですか?
unsigned型で負数を発生させる引き算の結果はよく定義されています。
- [中略)符号なしオペランドを含む計算がオーバーフローすることは決してありません。 なぜなら、結果の符号なし整数型によって表現できない結果は で表現できない結果は、結果の型が表現できる最大の値より1つ大きい数で減速されるからです。 というのも,結果として得られる符号なし整数型で表現できない結果は,結果として得られる型で表現できる最大の値より1つ大きい数だけ減少するからです。 (iso/iec 9899:1999 (e) §6.2.5/9).
ご覧のとおりです。
(unsigned)0 - (unsigned)1
は-1 modulo UINT_MAX+1、言い換えればUINT_MAXに等しいことがわかります。
符号なしオペランドを含む計算は決してオーバーフローしない"とあり、上限を超える場合にのみ適用されると思われるかもしれませんが、これは モチベーション この文の実際の結合部分に対する動機付けとして提示されます: "結果の符号なし整数型で表現できない結果は 結果として得られる符号なし整数型で表現できない結果は、結果として得られる型で表現できる最大の値より1大きい数で減数されます。 このフレーズは、型の上限のオーバーフローに制限されておらず、表現するには低すぎる値にも同様に適用されます。
関連
-
g++が内部・外部コマンドソリューションとして認識されない、MinGWを初めて使うときの落とし穴
-
C - 添え字の値が配列でもポインタでもベクトルでもないエラー
-
[解決済み] MIPSのネストされたForループと配列の使用
-
[解決済み] C - Setデータ構造を実装するには?
-
[解決済み] SQLiteのINSERT/per-secondのパフォーマンスを向上させる
-
[解決済み] 未定義、未指定、および実装で定義された動作
-
[解決済み] C言語標準に準拠した構造体の初期化方法
-
[解決済み] 2次元配列の反復処理において、ループの順序がパフォーマンスに影響するのはなぜですか?
-
[解決済み] LD_PRELOADのトリックとは何ですか?
-
[解決済み】符号なし整数のオーバーフローは定義されているのに、符号あり整数のオーバーフローは定義されていないのはなぜですか?
最新
-
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++の再定義
-
[解決済み] MIPSのネストされたForループと配列の使用
-
[解決済み] Linuxカーネルにおけるcontainer_ofマクロの理解
-
[解決済み] ソケットアクセプト - "開かれているファイルが多すぎる"
-
[解決済み] 配列のすべてのメンバーを同じ値で初期化するには?
-
[解決済み] 難読化Cコードコンテスト2006。sykes2.cの解説をお願いします。
-
[解決済み] char s[]とchar *sの違いは何ですか?
-
[解決済み] アセンブリがCより速いのはどんなとき?[クローズド]
-
[解決済み] FortranはC言語よりも重い計算を最適化しやすいですか?
-
[解決済み] 2次元配列の反復処理において、ループの順序がパフォーマンスに影響するのはなぜですか?