C++(およびCやJavaのような他のC-ような言語)で〜演算子は、ビット単位のNOT動作を行う - オペランド内のすべての1ビットが0に設定され、オペランド内のすべての0ビットがされていますつまり、元の番号の補数を作成します。詳細はhereを参照してください。
ビットごとのNOT演算子は、2の補数で表す数字に を適用したとき(上記の例でわかるように)、それは数の 符号を変更してから1を減算していることは興味深い性質を持っています。
あなたは〜演算子は、このようにyに何をするかをチェックした場合:
#include <stdio.h>
int main()
{
unsigned int x = -1;
printf("%i\n",x); // treat data as if singed integer
printf("%u\n",x); // treat data is if unsigned integer
int y = ~0; //type promotion from int to unsigned int
printf("%i\n",y);
if (x == y)
printf("same");
else
printf("not same");
return 0;
}
あなたが見ることができます:
成功時:0メモリ:16064信号:0
-1同じ
T ry out here。
これはなぜですか?あなたは符号なし整数でこれを読めば
整数で-1のビット表現は
11111111 11111111 11111111 11111111
は、可能な限り最大のunsigned int型である
11111111 11111111 11111111 11111111
を(詳細はtwo's complementを参照)されます。 unsigned intの-1は、ラップアラウンドのために最大の符号なし整数になります。 Therfore unsigned -1とint〜0は同じです。