2013-08-13 2 views
2

У меня создается впечатление, что тип Number в Javascript хранит любое число, целое число или float, в соответствии со стандартом IEEE с плавающей запятой. Если да, то почему побитовое ИЛИ-число с 0 округляет его?Почему OR 0 округляет числа в Javascript?

Играя с некоторыми другими операциями бит, кажется, что при применении битовых операций с числами с плавающей запятой число сначала округляется до 0, а затем применяются битовые операции (с номерами в представлении комплемента Two, а не в IEEE) , Это верно?

+2

Если я не ошибаюсь, все побитовые операции преобразуют вход в 32-битное * целое число *. – bfavaretto

+0

@bfavaretto это на самом деле первое предложение на mdn для побитового ops – aaronman

+0

@aaronman Я только что видел это. Но MDN явно не заявляет, что они становятся ints. В спецификации ясно, что он всегда использует [ToInt32] (http://www.ecma-international.org/ecma-262/5.1/#sec-9.5) на входе. – bfavaretto

ответ

3

В ECMAScript 5.1 все побитовые операции преобразуют вход в 32-разрядное целое и возвращают 32-разрядное целое число. Что касается операторов ^, & и |, section 11.10 говорит:

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

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

Обратите внимание, что ToInt32 применяется с обеих сторон до применения оператора.

2

Цитата MDN

операторов Побитовых рассматривают свои операнды в виде последовательности из 32 бит (нулей и единиц), а не в виде десятичных, шестнадцатеричного или восьмеричных чисел.

Если вы не относились номера, как этого побитовой опс не имеют особый смысл, поэтому это делается

+0

Более того, операнды преобразуются в целые числа перед применением операции ИЛИ. – nnnnnn

1

На уровне языка есть только парит, и временные целые числа операторов поразрядных ,

Per spec, поплавок превращается в 32-разрядное целое число, выполнив операцию абстрактный:

var n = (sign(number) * floor(abs(number))) % pow(2, 32); 
if(n >= pow(2, 31)) { 
    return n - pow(2, 32); 
} 
else { 
    return n; 
} 

Я должен подчеркнуть, что эта операция является абстрактным и, конечно, не сделано в приведенном выше способом с помощью любого двигателя поэтому не делайте никаких соображений по производительности. (Это относится и к любой другой операции спецификации)

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