12

私はVisual Studio 2013を使用しています。
最近~、1の補数の演算子を試しました:

int a = 10;
cout << ~a << endl;

出力は-11

しかし、

unsigned int a = 10;
cout << ~a << endl;

出力は4294967296

-11出力がsigned の場合である理由がわかりませんint。この混乱を助けてください。

4

4 に答える 4

22

数値 10 を 32 ビットの符号付きまたは符号なし整数に入れると、次のようになります。

0000 0000  0000 0000  0000 0000  0000 1010

それを否定すると、次のようになります。

1111 1111  1111 1111  1111 1111  1111 0101

これらの 32 ビットは、符号なし整数として 4294967285、または符号付き整数として -11 を意味します (コンピュータは、負の整数を2 の補数として表します)。また、32 ビットの浮動小数点数または 4 つの 8 ビット文字を意味する場合もあります。

ビットには「絶対的な」意味はありません。それらは、それらをどのように「見る」か (それらが持つタイプ) に応じて、何でも表すことができます。

于 2014-06-01T11:27:41.670 に答える
2

メモリには、どちらの場合も 4294967285 が格納されています (4294967296 は正しくはタイプミス、33 ビットですか?)。この数値の意味は、使用する符号度によって異なります。

  • 署名されている場合、この数値は -11 です。
  • 署名されていない場合は、4294967285 です。

同じ数の異なる解釈。

キャストすることで署名なしとして再解釈できますが、同じ結果になります。

int a = 10;
cout << (unsigned int) ~a << endl;
于 2014-06-01T11:30:21.310 に答える