2017-04-20 18 views

答えて

0

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は同じです。

関連する問題