このコードは B2 を出力します
short a=-5;
unsigned short b=-5u;
if(a==b)
printf("A1");
else
printf("B2");
整数昇格について読みましたが、まだ不明です。ここの例ではどのように機能しますか? コンパイラが値を拡大/切り捨てる際に従う手順を誰かが完全に投稿できますか?
このコードは B2 を出力します
short a=-5;
unsigned short b=-5u;
if(a==b)
printf("A1");
else
printf("B2");
整数昇格について読みましたが、まだ不明です。ここの例ではどのように機能しますか? コンパイラが値を拡大/切り捨てる際に従う手順を誰かが完全に投稿できますか?
コードを見てみましょう。
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 よりも大きいからです。
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
です。
short
tounsigned short
は変換です (したがって、変換ランクがあります)
short
toint
はプロモーションです (したがって、プロモーション ランクを持ちます)
ランキングのため、コンバージョンよりもプロモーションが優先されます。プロモーションは、算術およびその他の操作中に発生します。変換は、ある整数型を別の整数型に格納するだけで発生します。算術演算は、型を一緒に強制するために、変換と昇格を引き起こす可能性があります。別の例:
unsigned int u = 2;
int i = 2;
u + i;
i
に変換されます (昇格されません) unsigned
。
あなたの値は、 であるためにラップアラウンドするため、より大きな値に変換されunsigned
ます。その後、 に昇格しint
ます。このa != b
ためです。