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