16

これらの特定のケースごとに出力が異なる理由を理解するのに問題があります。サンプル コード a では、期待どおりに変数の昇格があり、> 6その結果は ですが、サンプル コード b では、結果は<= 6次のようになります。

/* **Code a** */
puts("Code a\n");
unsigned int a = 6;
int b = -20;
( a+b > 6) ? puts("> 6\n") : puts("<= 6\n");

/* **Code b** */
puts("Code b:\n");
uint8_t a1 = 6;
int8_t  b1 = -20;  
( a1+b1 > 6) ? puts("> 6\n") : puts("<= 6\n");

出力:

Code a

> 6

Code b:

<= 6
4

1 に答える 1

9

通常の算術変換は、加算のオペランドに対して実行されます。整数型の場合、これは必要に応じて整数の昇格で構成され、2 つのオペランドが同じ型を持たない場合は、それらを共通の型にするためにさらに変換が行われます。

最初のケースでは昇格はありませんが、 のすべての可能な値を保持できないため、intオペランドは に変換されます。unsigned intintunsigned int

2 番目のケースでは、両方のオペランドが共通の型を持つため、両方のオペランドが に昇格されint、そのままになります。int

6.5.6 参考までに、加法演算子のセクションのC11標準草案には次のように記載されています。

両方のオペランドが算術型の場合、通常の算術変換が実行されます。

セクション6.3.1.8通常の算術変換 言います:

算術型のオペランドを期待する多くの演算子は、同様の方法で変換を行い、結果の型を生成します。目的は、オペランドと結果の共通の実数型を決定することです。指定されたオペランドについて、各オペランドは型 domain を変更せずに、対応する実数型が共通実数型である型に変換されます。特に明記しない限り、共通実数型は結果の対応する実数型でもあり、その型ドメインはオペランドが同じ場合はオペランドの型ドメインであり、そうでない場合は複素数です。このパターンは通常の算術変換と呼ばれます

[...]

それ以外の場合、両方のオペランドで整数昇格が実行されます。次に、昇格されたオペランドに次の規則が適用されます。

[...]

  • それ以外の場合、符号なし整数型のオペランドのランクが他のオペランドの型のランク以上である場合、符号付き整数型のオペランドは符号なし整数型のオペランドの型に変換されます。

[...]

この理由については、次の質問を参照してください。C および C++ で算術演算を行う前に short を int に変換する必要があるのはなぜですか? .

于 2015-10-02T14:56:08.507 に答える