2012-02-17 12 views
6

In JavaScript, sembra:Perché il bit di bit JavaScript è OR o si comporta in modo strano?

(4294958077 | 0) == -9219 

Perché non è 4.294.958,077 mila?

Essa suggerisce che ci sia una sorta di trabocco calci in (anche se a quanto ho capito gamma di un tipo Number JavaScript è +/- 9007199254740992 modo che è strano in sé.)

Anche se era un overflow, sicuramente

(4294958077 | 0) == 4294958077 

dovrebbe valutare come vero, ma non è così.

aiuto per favore

+0

Controllare questo: 'avviso ((4294958077 | 0));' – Smamatti

risposta

5

Non ha nulla a che fare con il tipo in virgola mobile o trabocchi. Restituisce -9219 perché lo standard lo impone, poiché tutte le operazioni bit a bit binarie devono essere eseguite utilizzando con numeri interi a 32 bit firmati (ECMA-262 § 11.10).

La produzione A: Un @B, dove @ è uno degli operatori bitwise nelle produzioni di cui sopra, è valutata come segue:

  1. Let Lref tramite la risultato della valutazione A.
  2. Lasciate lval essere GetValue (lref).
  3. Lasciate rref essere il risultato della valutazione B.
  4. Lasciate rval be GetValue (rref).
  5. Lasciare lnum essere ToInt32 (lval).
  6. Let rnum essere ToInt32 (rval).
  7. restituiscono il risultato dell'applicazione del bit a bit operatore @ per lnum e rnum. Il risultato è un numero intero a 32 bit con segno.

4294958077 convertito in un numero intero a 32 bit con segno (usando l'algoritmo in ECMA-262 § 9.5) è -9219, e 0 è ancora 0, quindi il bit-o tornerà -9219.

+0

+1 come mostrato da (4294958077 | 0) >>> 0 === 4294958077 non -9219 –

2

Tutti i numeri in JavaScript sono numeri in virgola a 64 bit floating. Le operazioni bit a bit sui float sono un caso limite, quindi internamente quei float vengono temporaneamente convertiti in un int 32 bit, quindi viene eseguita l'operazione bit a bit, quindi il tuo overflow.

0

I numeri bit a bit JavaScript vengono archiviati come float firmati a 64 bit, ovvero solo 32 bit da utilizzare per il numero intero, che è stato superato, quindi è diventato strano convertendolo in un numero intero al meglio possibile e quindi facendo l'operazione.

Altre informazioni here (in particolare la sezione "oltre 32 bit") ma nessuna soluzione reale, quindi purtroppo è necessario aggirare il problema.

Problemi correlati