js中移位0位是什么操作,为什么值就变了

图片说明
图片中是在浏览器控制台下测试的,为什么有的移位0位值变了,有的却没有呢

来我来给你解释吧,js中变量定义是var吧? 所以当一个数比较大的时候它直接认为是长整型或者其它类型

所在 Math.pow(2,31)是整型结果是正整数也就是你的那个结果, 但是当它作位移运算的时候转为了int类型
int类型4个字节32位,从-2的31次方到2的31次方-1这个范围, 而正整数 2的31次方刚好是超过2的31次方-1
,而我们知道 数据在计算机中是以补码存放的 最高位的1 0 表示正负,1表负,2的31次变为有符好的整型
高位为刚好为1 所以就成负数了, 而2的32次方刚好是10000....000 32个0 刚好进位转为int的时候刚好
最高位33位的1溢出了所以结果为0 而长整型就没有这个问题。。 在如在c语言中也有相同的例子
如char在c语言中1个字节8位 最大表示范围0-255 你若 char a=128 整型输出为负数 是一个道理

对于非负数,相当于
mround = function (r) {
return parseInt(Number(r)||0);
}
就是取整,不过不能处理负数
因为 位移运算只用于整数,如果带小数的数据参与位移运算会被取整 移动0位其实并没有移动,只是取整了