2015-10-02 8 views
16

これらの特定のケースのそれぞれで出力が異なる理由を調べるのに問題があります。サンプルコードAで、私は期待どおり変数プロモーションと結果があるそれは> 6だが、サンプルコードBで、結果は<= 6です:Cの可変プロモーション

/* **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 
+0

に見てみましょう:[unsigned int型と署名したint型のCの式ではどのようなタイプにプロモートされるタイプ、存在している?](http://stackoverflow.com/questions/2280663/in-ac-expression私はそれはあなたを助けることを願っています )現在のint-ある-署名符号なし整数-と--where-型-意志。 – Missu

+0

テキスト出力用の画像を提供していますか?この質問を開いたときに自動的に読み込まれますか?その後ろにトラッカーがありますか?)このような場合には、カットアンドペーストを使用してください。 –

+5

基本的な、まだ十分に形成され、ポストの良い例:クリアタイトル、明確な難易度の文、サンプル・コード、出力、予想される出力、良いタグ。 – chux

答えて

9

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

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

2番目のケースでは、両方のオペランドがintに昇格され、共通タイプのため、intのままです。参考

セクションにおけるドラフトC11標準6.5.6添加オペレータは言う:

両方のオペランドが算術型を使用している場合、通常の算術変換を それらに対して実行されます。 6.3.1.8通常の算術変換

セクションは言う: 変換や歩留まりの結果タイプと同様の方法で、算術式の原因のオペランドを期待

多くの事業者。 の目的は、オペランドと結果の共通の実数型を決定することです。 指定されたオペランドの場合、各オペランドは、タイプ のドメインを変更することなく、対応する実タイプが共通タイプ タイプであるタイプに変換されます。 特に明記しない限り、一般的なリアルタイプもあるタイプのドメインが同じであれば、オペランドの 型ドメインである、とそうでない複雑な 結果、の対応する実数型を 。このパターンはそれ以外の場合は、整数プロモーションが両方のオペランドで実行され

[...]通常の算術変換

呼ばれます。符号なし整数型を持つオペランドが大きいかのタイプのランクに等しい をランク付けした場合、その後 次のルールは、それ以外の場合

  • [...]促進オペランド

    に適用されます他のオペランドは、次に 符号付き整数型を持つオペランドが符号なし 整数型とオペランドの型に変換され

[...]

これに関する理論的根拠は、Why must a short be converted to an int before arithmetic operations in C and C++?の質問に記載されています。

+0

今は完璧な意味があります。ありがとう – Lal0ver

+0

オペランドを共通型にするために必要な "整数昇格"と変換は、 "通常の算術変換"の一部です。 [N1570](http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf)6.3.1.8を参照してください。 –

+0

@KeithThompsonうーん、それはそうでない音にするために私が意味するものではありませんでしたが、私はそれがそのように読み込むかを見ることができます。 –

関連する問題