为什么不't|"操作员为大值工作

Why doesn't the "|" operator work for large values?

本文关键字:操作员 工作 为什么不 quot      更新时间:2023-09-26

我正在研究如何有效地检查值是否为整数的问题。一个答案建议使用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上做似乎不安全。为什么会这样?

JavaScript中的|运算符将其参数转换为有符号的32位整数,然后对其执行逐位或。|0或为零,这使值保持不变,因此这已成为将值转换为32位整数的JavaScript惯例(与桌面处理器上C中的int类型相同,是一种快速处理的数据类型,也是一种方便的舍入)。

我不确定Number.MAX_SAFE_INTEGER是否是标准的一部分;我刚在IE中尝试过,结果没有定义,但根据你的描述,它可能给了你32位或double(浮点)中可以容纳的最大数字:2^32-1,在32位的情况下大约是40亿,浮点值要大得多。但请记住,|会给你一个/签名/数字,所以实际上只有31位可用。另一位用于负数。

要将负数存储在二进制中(从技术上讲,是二进制补码),需要翻转所有位,然后在结果上加一。一个被存储为0001,所以翻转比特并加一得到1110+1==1111(当然,32比特的值更长,但概念相同),这与无符号时的最大值相同。

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

同时,逐位运算符处理32位整数。

我想你可以看到这件事的进展;)