2012-02-17 5 views
6

В JavaScript, кажется:Почему JavaScript побитовым или ведет себя странно?

(4294958077 | 0) == -9219 

Почему это не 4294958077?

Это говорит о том, что есть какое-то перелив ног в (хотя, как я понимаю, диапазон A Типа JavaScript Number является +/- 9007199254740992, так что странно сам по себе.)

Даже если это было переполнение, несомненно,

(4294958077 | 0) == 4294958077 

должен оцениваться как истинный - но это не так.

Помощь пожалуйста

+0

Проверьте это: 'alert ((4294958077 | 0));' – Smamatti

ответ

5

Это не имеет никакого отношения к типу с плавающей точкой или к переполнениям. Он возвращает -9219 , потому что стандарт задает его, так как все двоичные побитовые операции должны выполняться с использованием подписанных 32-битных целых чисел (ECMA-262 § 11.10).

Производство : @В, где @ является одним из битовых операторов в вышеперечисленных правилах, вычисляется следующим образом:

  1. Пусть LRef быть результат оценки A.
  2. Let lval be GetValue (lref).
  3. Let rref be result of B.
  4. Let rval be GetValue (rref).
  5. Let lnum be ToInt32 (lval).
  6. Пусть rnum быть ToInt32 (RVAL).
  7. Возврат результата применения побитового оператора @ к lnum и rnum. Результатом является 32-битное целое число.

4294958077 преобразуется в знаковое 32-битовое целое число (с использованием алгоритма в ECMA-262 § 9.5) -9219, и по-прежнему 0 0, так что побитовое или будет возвращать -9219.

+0

+1 как показано (4294958077 | 0) >>> 0 === 4294958077 не -9219 –

2

Все числа в JavaScript, являются числами с плавающей точкой 64-разрядные. Побитовые операции с поплавками - это кромка, поэтому внутренне эти поплавки временно преобразуются в 32-битный int, затем выполняется побитовая операция - следовательно, ваш переполнение.

0

JavaScript побитовые номера хранятся в виде подписанных 64-битных поплавков, т. Е. Вы используете только 32 бита для целого числа, которое вы превысили, так что это стало странно, превратив его в целое число, насколько это возможно, а затем выполняя операцию.

Дополнительная информация here (особенно раздел «за пределами 32-разрядного»), но нет реального решения, поэтому, к сожалению, вам нужно будет обойти его.

Смежные вопросы