符号なし変数への負の値の代入: 何が起こりますか?
C では、符号なし変数に負の値を代入しようとすると、次のようになります。例:
unsigned int nVal = 0; nVal = -5;
動作は次のようになります。
説明
C 標準のセクション 4.7 conv.integral によると:
「宛先の型が符号なしの場合、結果のvalue は、ソース整数に一致する最小の符号なし整数です (モジュロ2n ここで、n は符号なし型を表すために使用されるビット数です)。
2 の補数表現 (最新のプロセッサーのほとんどが使用) では、これは実際の変更がないことを意味します。切り捨てがない場合のビットパターン。結果は、(-5 232)、つまり 4294967291 と同等の値になります。これは、-5 の 2 の補数表現が 4294967291 のビット単位表現と同じであるためです。
つまり、符号なし変数に負の値を代入しても、オーバーフローや例外は発生しません。代わりに、同等の正の符号なし値にラップアラウンドします。
注:
この動作は C で明確に定義されていますが、広く理解されていません。符号なし変数を扱うときは、この潜在的な落とし穴に注意することが重要です。
以上がC で符号なし変数に負の値を代入するとどうなりますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。