14

重複の可能性:
2 つの文字を加算すると int が生成される

次の C++ コードがあるとします。

unsigned char a = 200;
unsigned char b = 100;

unsigned char c = (a + b) / 2;

出力は論理的に予想される150ですが、式に整数オーバーフローがあるべきではありません(a + b)か?

明らかに、ここでのオーバーフローに対処するために整数の昇格が必要です。そうでない場合、私には見えない何かが起こっています。誰かが私を啓発できるかどうか疑問に思っていたので、整数の昇格とオーバーフローに関して依存できるものと依存すべきでないものを知ることができます。

4

3 に答える 3

13

charC++ も C も、やのような「小さい」整数型で算術計算を実行しませんshort。これらの型は、ほとんどの場合int、さらなる計算が開始される前に昇格されます。したがって、あなたの式は実際には次のように評価されます

unsigned char c = ((int) a + (int) b) / 2;

PS の範囲が のint範囲をカバーしないいくつかのエキゾチックなプラットフォームではunsigned charunsigned intタイプはプロモーションのターゲット タイプとして使用されます。

于 2011-05-17T00:49:18.517 に答える
7

いいえ、これはエラーではありません。

コンパイラは常に最小の整数精度で計算し、結果は割り当て時にのみ unsigned char に変換されます。

これは標準にあります。

于 2011-05-17T00:49:10.467 に答える
0

他の回答によると、x86 およびその他の (正常な) 32 ビットおよび 16 ビット アーキテクチャではエラーではありません。

ただし、小規模またはあまり健全でないアーキテクチャ (通常は非常に小さなマイクロコントローラー) では、このようなことが問題を引き起こし始める可能性があります。特に、コンパイラを実装した人が、大企業の一部のテスト/検証予算を持っていない場合は特にそうです (繰り返しますが、マイクロコントローラ)。

于 2011-05-17T00:53:26.860 に答える