ホームページ > バックエンド開発 > C++ > C は、符号の異なる二項演算子の昇格をどのように処理しますか?

C は、符号の異なる二項演算子の昇格をどのように処理しますか?

Mary-Kate Olsen
リリース: 2024-12-02 08:00:13
オリジナル
870 人が閲覧しました

How Does C   Handle Binary Operator Promotion with Differing Signedness?

符号が異なる場合の二項演算子の昇格

二項演算子が符号の異なるオペランドを演算する場合、C 標準は昇格を決定するための特定のガイドラインを提供します。ルールとその結果の型。

標準のセクション 5/9 では、「通常のこのような演算子に適用される「算術変換」。これらの変換は階層順序に従います。

  1. いずれかのオペランドがlong doubleの場合、両方のオペランドはlong doubleに変換されます。
  2. いずれかのオペランドがdoubleの場合、両方のオペランドがdoubleに変換されます。
  3. どちらかのオペランドが float の場合、両方のオペランドが float に変換されます。
  4. 整数プロモーションは両方のオペランドで実行されます。
  5. どちらかのオペランドが unsigned long の場合、両方のオペランドは unsigned long に変換されます。
  6. 一方のオペランドが long int で、もう一方のオペランドが unsigned int の場合、long かどうかを判断します。 int は unsigned int のすべての値を表すことができます。その場合は、unsigned int を long int に変換します。それ以外の場合は、両方のオペランドを unsigned long int に変換します。
  7. どちらかのオペランドが long の場合、両方のオペランドは long に変換されます。
  8. どちらかのオペランドが符号なしの場合、両方のオペランドは unsigned に変換されます。
  9. それ以外の場合、両方のオペランドは型のままになります。 int.

これらのルールを提供されたコード例に適用します:

例 1:

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

unsigned int が優先されるためルールのステップ 5 で int を使用すると、すべてのオペランドが unsigned int に変換されます。したがって、結果は unsigned int 型になります。

例 2:

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

この場合、ルールにより、両方のオペランドを unsigned int に変換する必要があります。ただし、結果の値 (-1) は unsigned int で表現できません。したがって、式の結果の型は、§4.7/3 に従って実装定義されます。

以上がC は、符号の異なる二項演算子の昇格をどのように処理しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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