js中的|是按位或操作符,例如a | b,就是拿a和b的二进制搁在一块对比,相同位置只要有一个为1,那么结果就为1,如果都是0,那么结果就是0。

a | 0,一般这种用法的是想将小数变成整数,如3.2 | 0=3,类似用法的还有3.2>>0,3.2^0等。

按照道理来说a | 0的结果一般都是a:

但是如果你用2147483648 | 0会发现结果不是2147483648,而是-2147483648,这是为什么呢?

问题分析

我们知道js中表示数字的都是用64位双精度浮点型表示。但是在进行位运算的时候会给4个字节去处理(32位有符号)。

32位有符号可以表示的范围在-2147483648到2147483647,如果进行位运算的在这个范围之内的没问题,但是如果大于这个数值(64位可以表示的范围远大于它),那么就会发生截断的情况。

看到没有,在64位的时候,好好的,但是突然进行位操作,把它打进4个字节的空间里,就会舍去之间的信息。与之类似的还有一个问题是-2147483649 | 0=2147483647

上面说到的情况在位运算的时候都会遇到,例如2147483648^0,2147483648>>0,2147483648&2147483648等,因此希望大家多长个心眼,以后看到这种问题要小心处理。

回到顶部
我要评论

所有评论

返回
邮箱:
绑定
取消
×

我要评论

回复:

昵称:(昵称不超过20个字)

图片:

邮箱:
绑定邮箱后,若有回复,会邮件通知。
提交
还可以输入500个字