出力は2の補数にも16または32ビットのint
にも依存しません。見られる出力は完全に定義されており、まれな1の補数または符号量マシンでは同じになります。結果は16ビットに依存しますunsigned short
-12345は、その割り当てに問題がないように、short
の最小範囲内にあります。 ... short
が...引数として渡された場合、short
はint
の範囲にあるため、通常のプロモーションはint
に変更されず、値の変更はありません。 "%d"
はint
を期待するので、出力は
short int v = -12345;
printf("%d\n", v); // output "-12345\n"
"-12345"
が明確に定義された符号なしの型に負の数を割り当てています。 16ビットunsigned short
と、uv
の値が、値は...引数としてunsigned short
を渡す53191.
の最終値に(この例では65536)USHRT_MAX+1
の最小倍数プラス-12345でありますint
またはunsigned
に変換されます。いずれのタイプにも、unsigned short
の全範囲が含まれます。 IAC、値は変更されません。 "%u"
はunsigned
と一致します。値がint
またはunsigned
のいずれかとして表示されるint
にも一致します。符号なしshortに値をキャストしたときに、この結果につながるどのような操作
short int v = -12345;
unsigned short uv = (unsigned short) v;
printf("%u\n", v); // output "53191\n"
?
キャスティングは最終結果に影響しませんでした。同じ結果がキャストなしで起こったでしょう。キャストは静かな警告に役立つかもしれません。
私に見えます。あなたはどんな結果を期待しましたか? –
@SteveSummit実際には私には間違っているようです... http://port70.net/~nsz/c/c11/n1570.html#6.3.1.3p2によると、それは '53190'であるはずです。私が正しくそれを読んでいるなら... –
@EugeneSh。あなたは正しくそれを読んでいません;-) –