符号なし変数への負の値の代入: 謎の解明
符号なし変数への負の値の代入の潜在的な結果に興味をそそられたプログラマは、実験中です。 nVal という名前の符号なし整変数に負の値 -5 を代入すると、コンパイラにエラーが発生しないことに彼らは驚きました。しかし、プログラムを実行すると、予期せぬ結果が明らかになりました。nVal が特殊な値を保持していました。
説明を求めて、プログラマは C 標準を詳しく調べました。符号付き整数型からの変換に関するセクション 4.7 conv.integral で洞察が得られました。標準によれば、宛先型が符号なしの場合、「結果の値は、ソース整数に一致する最小の符号なし整数になります (モジュロ 2n、n は符号なし型を表すために使用されるビット数です)」 ."
本質的に、これは、非 2 の補数アーキテクチャ (符号付き振幅、 1 の補数)、符号なしへの変換は 2 の補数が使用されたかのように動作します。さらに、値が unsigned 型の範囲内に収まるまで 2n を繰り返し加算または減算することは、数学的には 2 の補数の符号拡張または切り捨てと等価です。
具体的には、2 の補数の場合、ビット パターン2n を追加すると変更がキャンセルされるため、変更されないままになります。 2n はすべてゼロです。このプロパティにより、2 の補数の加算/減算が符号なしのビット単位の演算と同等になるため、特別なステータスになります。
浮動小数点から符号なし整数への変換が異なることは注目に値します。このような場合、負の値や符号なし型の範囲を超える値を指定すると、未定義の動作が発生します。符号付き整数から符号なし整数への変換のみがモジュロ リダクションを使用します。
以上がC で符号なし整変数に負の値を代入するとどうなりますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。