根据IEEE浮点标准,我认为Javascript中的Number类型存储任何数字,整数或浮点数。如果是这样,那么为什么用0对数字进行按位OR运算呢?
使用其他位操作时,似乎在将位操作应用于浮点数时,该数字首先向0舍入,然后应用位操作(数字以二进制补码表示而不是IEEE)。这是对的吗?
答案 0 :(得分: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应用于双方。
答案 1 :(得分:2)
答案 2 :(得分:1)
在语言级别,只有浮点数和按位运算符的临时整数。
Per spec,通过执行抽象操作将float转换为32位整数:
var n = (sign(number) * floor(abs(number))) % pow(2, 32);
if( n >= pow( 2, 31 ) ) {
return n - pow( 2, 32 );
}
else {
return n;
}
我必须强调这个操作是抽象的,当然不是由任何引擎以上述方式完成的,所以不要从中得出任何性能考虑因素。 (这适用于任何其他规范操作)