ホームページ > バックエンド開発 > C++ > C のプロモーション ルールは、符号付き整数型と符号なし整数型が混在する二項算術演算子の戻り型をどのように決定しますか?

C のプロモーション ルールは、符号付き整数型と符号なし整数型が混在する二項算術演算子の戻り型をどのように決定しますか?

Patricia Arquette
リリース: 2024-11-28 08:30:11
オリジナル
813 人が閲覧しました

How Do C   Promotion Rules Determine the Return Type of Binary Arithmetic Operators with Mixed Signed and Unsigned Integer Types?

符号タイプが混合された二項演算子の算術演算をプロモーション ルールがどのように管理するか

次のコードを考えてみましょう。

int max = std::numeric_limits<int>::max();
unsigned int one = 1;
unsigned int result = max + one;
ログイン後にコピー

演算子は結果を 2147483648 として計算し、署名されていないことを示唆します戻り値の型として int を使用します。逆に、次のコードでは:

unsigned int us = 42;
int neg = -43;
int result = us + neg;
ログイン後にコピー

結果は -1 で、戻り値の型が int であることを示します。

プロモーション ルールの解決

The C標準では、算術二項演算子 (C §5/9):

  1. いずれかのオペランドがlong doubleの場合は、両方ともlong doubleに変換します。
  2. どちらかのオペランドがdoubleの場合は、両方ともdoubleに変換します。
  3. いずれかのオペランドが浮動小数点数の場合、両方とも浮動小数点数に変換します。
  4. 両方に整数昇格を適用します。
  5. どちらかのオペランドが unsigned long の場合、両方とも unsigned long に変換します。
  6. 一方のオペランドが long int で、もう一方の unsigned int の場合、可能であれば unsigned int を long int に変換し、それ以外の場合は unsigned int に変換します。両方を unsigned long int に変換します。
  7. どちらかのオペランドが長ければ、両方とも に変換します。 long.
  8. どちらかのオペランドが符号なしの場合、両方とも符号なしに変換されます。
  9. 両方のオペランドが int の場合、それ以上の変換は行われません。

の影響例

どちらの例でも、プロモーション ルールの結果は演算子の計算の unsigned 型。

例 1: max と one は両方とも unsigned int にプロモートされ、戻り値の型は unsigned int になります。

例 2: プロモーション ルールでは、int と unsigned int のどちらが明確に勝者であるかは決まりません。ただし、符号なしタイプが選択されているため、結果の符号なしオーバーフローが発生します。結果は最終的に int に割り当てられるため、結果の値は C §4.7/3 に従って未定義です。

以上がC のプロモーション ルールは、符号付き整数型と符号なし整数型が混在する二項算術演算子の戻り型をどのように決定しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート