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.