Qualcuno può dire la procedura interna del codice qui sotto
<? $temp = 0; echo ~$temp; ?>
//instead of 1 it displays -1
Qualcuno può dire la procedura interna del codice qui sotto
<? $temp = 0; echo ~$temp; ?>
//instead of 1 it displays -1
Bitwise-non (~):
Questo inverte ogni bit del suo operando. Se l'operando è un valore in virgola mobile, viene troncato a un numero intero prima del calcolo. Se l'operando è compreso tra 0 e 4294967295 (0xffffffff), verrà considerato come un valore a 32 bit senza segno. In caso contrario, viene trattato come un valore a 64 bit con segno
suo perché si sta effettivamente che fare con un pieno a 32 bit numero intero senza segno con NOT. Ciò significa che non stai semplicemente invertendo 0001 ma invertendo 00000000000000000000000000000001
che diventa 11111111111111111111111111111110
Essenzialmente questo è il numero + 1 e negato. così diventa 1 - (num + 1), che è -1 o in binario (non firmato)
per esempio: - $ temp = 1; echo ~ $ temp; print -2 // - (n ++)
echo ~$temp;
^bitwise not operator
Supponendo a 32 bit, Bitwise inverso di 0000
è FFFF
(Tutti 1
's) che è -1
, nel caso di int firmato.
Un altro modo di vedere le cose: Che ~
ha fatto è quello di dare il (One's complement)
Al fine di ottenere il negativo di un numero, si prende complemento a 2, che è solo il 1's complement + 1
Quindi,
(1's complement of 0) + 1 = 0 //negative 0 is 0
hence, 1's complement of 0 = -1
Perché ~0
è -1
.
~
l'operatore ripristina ogni bit di 0
.
La relazione è: -$temp === ~$temp + 1
Bella risposta proveniente da Cthulhu. –
il segno è abbastanza importante;) – Christoph