2017-04-20 5 views

Antwort

0

Der Operator ~ in C++ (und andere C-ähnliche Sprachen wie C und Java) führt eine bitweise NOT-Operation - alle 1-Bits in den Operanden auf 0 und alle 0-Bits in den Operanden gesetzt sind auf 1 gesetzt. Mit anderen Worten, es erzeugt das Komplement der ursprünglichen Zahl. Für weitere Details siehe here.

Die bitweiser NOT-Operator hat eine interessante Eigenschaft, dass, wenn auf Zahlen von Zweierkomplement dargestellt angewandt, es Zeichen der Nummer der ändert und subtrahiert man dann (wie Sie in dem obigen Beispiel sehen).

Wenn Sie überprüfen, was der -Operator tut y wie folgt aus:

#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; 
} 

Sie können sehen:

Erfolg Zeit: 0 Gedächtnis: 16064 Signal: 0

-1 gleich

T ry out here.

Warum ist das so?

Die Bit-Darstellung für -1 in integer (siehe two's complement für Details)

11111111 11111111 11111111 11111111 

Wenn Sie diese in unsigned integer lesen

11111111 11111111 11111111 11111111 

die größtmögliche unsigned int ist. -1 in unsigned int wird die maximal vorzeichenlose int-Zahl aufgrund von wrap around. Daher sind unsigned -1 und int ~ 0 gleich.

Verwandte Themen