質問

重複の可能性:
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 ビット アーキテクチャ上.

ただし、小規模またはそれほどまともでないアーキテクチャ (通常は非常に小さなマイクロコントローラー) では、特にコンパイラーを実装した人に大企業ほどのテスト/検証予算がない場合、このようなことがおそらく問題を引き起こし始めるでしょう (繰り返しになりますが、マイクロコントローラー)。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top