整数オーバーフロー - なぜ [複製] しないのか
-
14-11-2019 - |
質問
重複の可能性:
2 つの char を加算すると int が生成されます
次の C++ コードがあるとします。
unsigned char a = 200;
unsigned char b = 100;
unsigned char c = (a + b) / 2;
出力は 150 です 論理的に 予想通りですが、式に整数のオーバーフローがあってはなりません (a + b)
?
明らかに、ここでのオーバーフローに対処するために整数のプロモーションが必要です。そうでない場合は、私には見えない何かが起こっています。整数昇格とオーバーフローに関して、何が依存できるのか、何を依存すべきでないのかを知ることができるように、誰かが私を啓発してもらえないかと思いました。
解決
C++ も C も、次のような「より小さい」整数型での算術計算は実行しません。 char
そして short
. 。これらのタイプは、ほとんどの場合次の職に昇格します。 int
さらなる計算が始まる前に。つまり、あなたの式は実際には次のように評価されます
unsigned char c = ((int) a + (int) b) / 2;
追伸いくつかのエキゾチックなプラットフォームでは、 int
の範囲をカバーしていません unsigned char
, 、 タイプ unsigned int
プロモーションのターゲット タイプとして使用されます。
他のヒント
いいえ、これはエラーではありません。
コンパイラは常に最小の整数精度で計算し、結果は代入時にのみ unsigned char に変換されます。
これは規格内にあります。
他の回答によると、それはエラーではありません x86 およびその他の (健全な) 32 ビットおよび 16 ビット アーキテクチャ上.
ただし、小規模またはそれほどまともでないアーキテクチャ (通常は非常に小さなマイクロコントローラー) では、特にコンパイラーを実装した人に大企業ほどのテスト/検証予算がない場合、このようなことがおそらく問題を引き起こし始めるでしょう (繰り返しになりますが、マイクロコントローラー)。