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等,因此希望大家多长个心眼,以后看到这种问题要小心处理。

    回到顶部
    我要评论

    所有评论

      相关文章