符号なし変数に負の値を代入するとどうなるか知りたいと思いました。
コードは次のようになります。
unsigned int nVal = 0;
nVal = -5;
コンパイラエラーは発生しませんでした。プログラムを実行すると、nVal
に奇妙な値が割り当てられました!いくつかの2の補数値がnVal
に割り当てられるのでしょうか?
公式の回答-セクション4.7 conv.integral
「宛先タイプが符号なしの場合、結果の値は、ソース整数と一致する最小の符号なし整数です(モジュロ2n ここで、
n
は符号なしの型を表すために使用されるビット数です)。 [注:2の補数表現では、この変換は概念的なものであり、ビットパターンに変更はありません(切り捨てがない場合)。 —注を終了]
これは基本的に、基礎となるアーキテクチャが2の補数(符号付き大きさ、1の補数など)ではないメソッドに格納されている場合、符号なしへの変換は2の補数であるかのように動作する必要があることを意味します.
-5を表すビットパターン(2の補数)を符号なし整数に割り当てます。これは大きな符号なしの値になります。 32ビット整数の場合、これは2 ^ 32-5または4294967291になります
最大符号なし整数-4の値の正の整数として表示されます(値はコンピューターのアーキテクチャーとコンパイラーに依存します)。
ところで
これを確認するには、簡単なC++「hello world」タイプのプログラムを作成し、自分で確認します。
そのとおり、符号付き整数は2の補数形式で格納され、符号なし整数は 符号なしバイナリ表現 で格納されます。 C(およびC++)はこの2つを区別しないため、最終的に得られる値は、2の補数バイナリ表現の符号なしバイナリ値になります。
はい、あなたは正しいです。実際に割り当てられる値は、3番目を除くすべてのビットセットのようなものです。 -1はすべてのビットが設定され(16進数:0xFFFFFFFF)、-2は最初のビットを除くすべてのビットです。表示されるのは、おそらく16進数値0xFFFFFFFBで、10進数では4294967291に対応しています。