2012-11-01 17 views
6

Qualcuno può dire la procedura interna del codice qui sotto

<? $temp = 0; echo ~$temp; ?> 
    //instead of 1 it displays -1 

risposta

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 ++)

4
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 
+0

Bella risposta proveniente da Cthulhu. –

+0

il segno è abbastanza importante;) – Christoph

0

Perché ~0 è -1.

~ l'operatore ripristina ogni bit di 0.

La relazione è: -$temp === ~$temp + 1

Problemi correlati