为什么没有" |"操作员为大值工作?

时间:2014-04-16 15:37:02

标签: javascript

我正在考虑this question关于如何有效地检查值是否为整数。建议使用n === (n|0)通过|运算符快速舍入一个答案。一时兴起,我决定用Number.MAX_VALUE测试它。尽管这应该是一个整数(我想?),但测试结果是假的。

Number.MAX_SAFE_INTEGER也回来了,所以我决定测试其他一些大数字并找到以下内容:

Number.MAX_VALUE | 0           --> 0
Number.MAX_SAFE_INTEGER | 0   --> -1
Number.MAX_SAFE_INTEGER/2 | 0 --> -1
Number.MAX_SAFE_INTEGER/8 | 0 --> -1
1234567890 | 0                --> 1234567890 

我不确定|运营商在内部做了什么,但在MAX_SAFE_INTEGER上做起来似乎并不安全。为什么会这样?

2 个答案:

答案 0 :(得分:3)

JavaScript中的|运算符将其参数转换为带符号的32位整数,然后按位或按位执行。 |0或者为零,它保持值不变,因此它已成为一种JavaScript约定,用于将值转换为32位整数(与桌面处理器上的C中的int类型相同,是一种快速数据类型处理以及方便的一轮)。

我不确定Number.MAX_SAFE_INTEGER是否属于标准;我刚刚在我的IE中尝试了它并且它返回undefined,但根据你的描述,它可能会给你最大的数字,可以适合32位或double(浮点):2 ^ 32- 1,在32位的情况下大约40亿,而浮动的东西大得多。但请记住|给你一个/ signed / number,所以实际上只有31位可用。另一位用于负数。

要以二进制形式存储负数(从技术上讲,二进制补码),您可以翻转所有位,然后在结果中添加一位。一个存储为0001,因此翻转位并添加一个给出1110 + 1 == 1111(当然,32位但相同概念的值更长),这与无符号时的最大值相同。

答案 1 :(得分:1)

虽然MAX_SAFE_INTEGER是一个整数...但它是双精度浮点格式的整数,即。 53位长。

同时,按位运算符用于32位整数。

我想你可以看到它的发展方向;)