結果が負の場合に同じ型の別の整数から符号なし整数を減算する際に問題があると思われる人からのコードを見つけました。このようなコードは、ほとんどのアーキテクチャでうまく動作しても間違っています。符号なし整数減算は動作を定義していますか?
unsigned int To, Tf;
To = getcounter();
while (1) {
Tf = getcounter();
if ((Tf-To) >= TIME_LIMIT) {
break;
}
}
これは、私が見つけることができるC標準の曖昧な唯一の引用です。
符号なしオペランドを含む計算することができる決して超える流動、低減され、得られた符号なし整数 型で表現することができない 結果は、で表すことができる最大 値より1大きい数を法とするので結果の型。
右のオペランドが大きいときは、モジュロ・トランケートされた数値のコンテキストで操作が意味をなさないように調整されていると思います。
は0x0000
すなわち - は0x0001 == 0X 0000 - 0xFFFFの== 0x0001の実装に依存する署名されたセマンティクスを使用するのではなくとして:
0000 - は0x0001 ==(符号なし) (0 + -1)==(0xFFFFでも0xFFFEまたは0x8001)
どちらの解釈が正しいですか?それはまったく定義されていますか?
標準の単語の選択は不幸です。 「オーバーフローできない」というのは、エラー状況ではないことを意味します。オーバーフローするのではなく、標準の用語を使用して値が「ラップする」。 – danorton