2016-07-07 6 views
5

私はシンプルなCプログラムを書いており、整数昇格が起こっているかどうかを知りたがっています。Cプログラムの整数昇進

整数昇格の仕組みと避け方を教えてください。

/* start of main */ 

unsigned short int res; 
unsigned short int bsp; 
signed short int analog; 

bsp = 2215; 
analog = 2213; 
if((signed short int)(bsp - analog) > 0){ 
    res = bsp - analog; 
    printf("%d", res); 
} 
else{ 
    res = analog - bsp; 
    printf("%d", res); 
} 
+1

ヒント: 'printf("%d "、res);'見て... –

+0

@Ravi整数昇格については、Souravが言ったことを参照してください。あなたは "普通の算術変換"を意味しますか? –

+0

'bsp-analog'と' analog-bsp'の両方がプロモーションを引き起こします。 – Sergio

答えて

2

私はintている32ビットにこの答えを制限するつもりだ、とshortは16ビットであること。

bsp - analogは、タイプintの式である。 bsp - analogshortで表現できない場合

shortにこれをキャストの動作は保証されません。したがって、(signed short int)(bsp - analog)のようなコードを慎重に記述してください。

printfコールでresからintへの暗黙のプロモーションがあります。

最後に、望ましくないプロモーションを避けるための最良の方法は、全体を通して同じタイプで作業することです。あなたのケースではintまたはlongを使用することを検討してください。

+0

NMDVですが、 '最後に、あなたのprintf呼び出しでintにresを暗黙的に宣伝することを回避するために、%huをフォーマッタとして使用します.'はおそらく正しい単語ではありません。 –

+0

通知 "は、整数昇格に従って が宣言されましたが、その値は をshort intまたはunsigned short intに変換してから印刷します);"実際にプロモーションを止めることは決してありません。 –

+1

@Bathsheba _ _ "未定義の動作"ではなく_ "実装が定義されていません" _? –

2

整数キャンペーンは、プログラム内の2つの異なるソースから発行されている:(なぜならprintf

  • デフォルト引数プロモーション(なぜならバイナリ-オペレータの)

    • 通常の算術変換を可変機能)

    ボー0のタイプの引数のいずれかがintに昇格されます。つまり、intの範囲は、以前のタイプが保持できるすべての数値を保持できるとします。通常、このように発生するのは、shortintがそれぞれ16ビットと32ビットのためです。井戸以下chuxのcommentで述べたよう>演算子()のような同様


    1)。

  • +1

    一般的な算術変換_は '>'の比較のために発生します。 – chux