13

ブール値を一緒に追加しようとしました。

bool i = 0, j = 0, k = 0;
cout << sizeof(i + j + k) << endl;

結果は 4 です。これは、結果が「int」値に変換されることを意味します。

質問したいのですが、これは C/C++ 標準操作ですか? オーバーフローした場合、コンパイラは一時値がより大きな型に変換されることを常に保証しますか? ありがとう!

回答ありがとうございます。フォローアップの質問を 1 つ: たとえば、 unsigned short i = 65535, j = 65535; cout << sizeof(i + j) << endl; 結果は 4 です。なぜ 'int' に昇格したのですか?

4

2 に答える 2

23

変換を引き起こすのはオーバーフローではなく、まったく算術を行ったという事実そのものです。C++ (および動作が発生した C) では、組み込み型の基本的な算術演算子のオペランドは、計算が行われる前に一連の明確に定義されたプロモーションを通過します。これらの規則の最も基本的な (やや簡略化された) は、 より小さい型はすべてintに昇格されるということintです。

あなたのフォローアップの質問には同じ答えがあります - あなたshortは よりも小さいので、追加が行われる前に にint昇格します。int

この StackOverflow の質問には、プロモーションをより詳細に説明するいくつかの回答があります。

于 2013-06-18T21:31:22.540 に答える
1

まず、sizeof結果が値に変換されることはわかりませんintboolと同じサイズのは許可されており、実際には珍しくありませんint

ただし、実際にはinthere を取得しますが、それは値とは関係ありません (実際、型は値に依存することはできません。これは、一般に、値は実行時までわからないため、型はコンパイル時に決定する必要があるためです)。

加算する前に、 は整数型として定義されているため、bool値は に昇格され、すべてより小さい整数型はに昇格されます。次に、3 つの値を追加します ( 3 より大きいことが保証されているため、どの値を使用してもオーバーフローしない操作です)。intboolint intintboolINT_MAX

于 2013-06-18T21:36:47.393 に答える