8

このコードは B2 を出力します

short a=-5;
unsigned short b=-5u;
if(a==b)
    printf("A1");
else
    printf("B2");

整数昇格について読みましたが、まだ不明です。ここの例ではどのように機能しますか? コンパイラが値を拡大/切り捨てる際に従う手順を誰かが完全に投稿できますか?

4

3 に答える 3

9

コードを見てみましょう。

short a = -5;

a = -5 で、short に収まります。ここまでは簡単。

unsigned short b = -5u;

-5u は単項演算-子を定数 5u に適用することを意味します。5u は (unsigned int) 5 であり、単項-は昇格しないため、2^32-5 である 4294967291 になります。(更新:元の回答でこれが少し間違っていました。このバージョンが正しいことを示すテストスクリプトを参照してください http://codepad.org/hjooaQFW

これを b に入れると、unsigned short (通常は 2 バイト) に切り捨てられるため、b = 65531、つまり 2^16-5 になります。

if( a == b )

この行では、比較が正しく行われるように、a と b の両方が int に昇格されます。それらがショートパンツに昇格した場合、b がラップアラウンドする可能性があります。それらが unsigned short に昇格した場合、a がラップアラウンドする可能性があります。

と言うようなものif( (int) a == (int) b )です。a = -5 なので (int) a = -5、b = 65531 なので (int) b = 65531 です。int は short よりも大きいからです。

于 2013-03-06T19:15:12.700 に答える
3
a == b

a上記の式ではb両方とも昇格されます。int

unsigned short b=-5u;

この宣言では、整数変換 (C99、6.3.1.3p2 がここに適用されます) によって-5U変換され、大きな値になります。unsigned short

(C99, 6.3.1.3p2) 「それ以外の場合、新しい型が符号なしの場合、値が新しい型で表現できる最大値よりも 1 多い値を繰り返し加算または減算して、値が新しいタイプ。"

b値は(unsigned short) ((unsigned int) USHRT_MAX + 1 -5)である(unsigned short) 65531場合USHRT_MAX(unsigned short) 65535です。

だからあなたが持っているものは次のとおりです:

(short) -5 == (unsigned short) 65531

これは、両方のオペランドを次のように整数昇格した後と同等です。

-5 == 65531

と同等0です。

于 2013-03-06T19:09:41.463 に答える
1

shorttounsigned shortは変換です (したがって、変換ランクがあります)

shorttointはプロモーションです (したがって、プロモーション ランクを持ちます)

ランキングのため、コンバージョンよりもプロモーションが優先されます。プロモーションは、算術およびその他の操作中に発生します。変換は、ある整数型を別の整数型に格納するだけで発生します。算術演算は、型を一緒に強制するために、変換と昇格を引き起こす可能性があります。別の例:

unsigned int u = 2; 
int i = 2; 
u + i;

iに変換されます (昇格されません) unsigned

あなたの値は、 であるためにラップアラウンドするため、より大きな値に変換されunsignedます。その後、 に昇格しintます。このa != bためです。

于 2013-03-06T19:12:31.517 に答える