2012-12-27 13 views
5

Facendo alcuni test con operazioni bit per bit/spostamento con JavaScriptPerché 0x80000000 >> 1 in JavaScript produce un valore negativo?

0x80000000 >> 1 // returns -1073741824 (-0x40000000) 

Mi aspetterei che per tornare 0x40000000 dal

0x40000000 >> 1 // returns 0x20000000 
0x20000000 >> 1 // returns 0x10000000 
+3

Questo perché 0x800 ... è 0b10000 ... e quando lo si sposta a destra in un punto diventa 0b1100 ..., un numero negativo. D'altra parte, 0x400 ... è 0b0100 ... e 0x200 ... è 0b0010 ... e non hanno questo problema. – NullUserException

+0

@NullUserException scusa se si tratta di cose molto semplici, ma perché non diventa 0b0100 ...? può 0x80 .. essere spostato in modo da produrre un 0x40 positivo ..? – lostsource

+0

@NullUserException: dovrebbe essere una risposta –

risposta

3

In Javascript, >> è il Operatore di spostamento a destra con firma. In §11.7.2 del language specification si dice:

Esegue un segno di riempimento bit a bit operazione di spostamento a destra sulla operando sinistro della quantità specificata dalla operando di destra.

Prima dello spostamento, l'operando di sinistra viene convertito in un numero intero a 32 bit con segno (passaggio 5 dell'algoritmo indicato nella specifica). Nel tuo caso questa conversione trasforma il dato numero positivo in un valore negativo. Dopodiché, lo spostamento vero e proprio è fatto, preservando il segno negativo del valore.

Problemi correlati