符号付き整数と符号なし整数を処理する演算子を使用したプロモーション ルール
オペランド間の異なる符号性を伴う二項演算子を扱う場合、次のようなプロモーション ルールが適用されます。 C 標準が登場します。これらのルールは、演算の結果の型とオペランドの変換方法を決定します。
特に、ここでは「通常の算術変換」が適用されます (§5/9)。これらの変換は優先順位の降順でランク付けされます。
- Long double (存在する場合)
- Double
- Float
- 整数プロモーション (short/int を変換) /long long to int/long/long long)
- 符号なしlong (if present)
- long int がすべての unsigned int 値を表すことができる場合は Long、それ以外の場合は unsigned long int です
- Long (存在する場合)
- Unsigned (存在する場合)
これらのルールを 2 つのシナリオに適用する提示:
シナリオ 1:
int max = std::numeric_limits<int>::max();
unsigned int one = 1;
unsigned int result = max + one;
- 最大値は signed int、1 つは unsigned int
- 統合プロモーションが発生し、その結果、 max as int
- unsigned int の方が上位にランクされるため、結果の型はis unsigned int
- 結果: 2147483648 への unsigned オーバーフロー
シナリオ 2:
unsigned int us = 42;
int neg = -43;
int result = us + neg;
- us は unsigned int、否定は署名されていますint
- 整数昇格が発生し、結果として unsigned int、neg as int
- unsigned int の方が上位にランク付けされるため、結果の型は unsigned int になります
- ただし、値はof us neg (-1) は int
- では表現できません。結果: 実装定義動作、おそらく -1 を返すか、プラットフォームに依存します
以上がC のプロモーション ルールは、符号付き整数と符号なし整数を使用したバイナリ演算をどのように処理しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。