2012-11-01 23 views
6

Czy ktoś może powiedzieć procedurę wewnętrzną kodu poniżej

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

Odpowiedz

1

bitowym nie (~)

Wplynie każdy bit jego operandu. Jeśli operand jest wartością zmiennoprzecinkową, przed obliczeniem jest on obcinany do liczby całkowitej. Jeśli operand wynosi od 0 do 4294967295 (0xffffffff), będzie traktowany jako niepodpisana wartość 32-bitowa. W przeciwnym razie jest traktowany jako podpisana wartość 64-bitowa

Jest tak, ponieważ faktycznie masz do czynienia z pełną 32-bitową liczbą całkowitą bez znaku z NOT. Co to znaczy, nie jesteś po prostu odwracanie 0001 ale odwracanie 00000000000000000000000000000001

który staje 11111111111111111111111111111110

istocie jest to liczba + 1 i zanegowane. 1 staje się więc - (Lb + 1), który jest 1 lub binarnie (znaku)

na przykład: - $ temp = 1; echo ~ $ temp; print -2 // - (n ++)

4
echo ~$temp; 
    ^bitwise not operator 

Zakładając 32-bit, Bitwise odwrotność 0000 jest FFFF (wszystkie „s 1), który jest -1, w przypadku podpisanych INT.


Innym sposobem na to patrzeć: Co ~ zrobił to, aby dać Ci (One's complement)

W celu uzyskania ujemnego numeru, można podjąć 2 dopełnienie, który jest po prostu 1's complement + 1

Więc

(1's complement of 0) + 1 = 0 //negative 0 is 0 
hence, 1's complement of 0 = -1 
+0

Dobra odpowiedź od Cthulhu. –

+0

znak jest dość ważny;) – Christoph

0

Ponieważ ~0 to -1.

~ Operator powraca do stanu.

Związek jest: -$temp === ~$temp + 1

Powiązane problemy