如果位移太多,Javascript 数字将重置为 0

标签 javascript bit-manipulation

所以我试图在 javascript 中创建一些函数来移动和操作数字位。但是,我在我的控制台中发现了以下行为

> var a = 1;
undefined
> a <<= 3
8
> a <<= 55
67108864
> a <<= 40
0

我的问题是,如果值在某个点以上变大,为什么数字会回到零?在 python 等其他语言中,数字不断变大,或者使用符号来保存数字的值。或者,显示溢出错误。为什么 JavaScript 只是将数字重置为零?

最佳答案

根据 the documentation :

Shift operators convert their operands to 32-bit integers in big-endian order and return a result of the same type as the left operand. The right operand should be less than 32, but if not only the low five bits will be used.

因此,在您的 55 (0x110111)40 (0x101000) 的情况下,您正在通过 23 (0x10111)8 (0x01000) 分别为:

> var a = 1;
undefined
> a <<= 3
8
> a <<= 23
67108864
> a <<= 8
0

请注意,虽然这些与您所写的不同,但答案与您得到 0 的原因相同,请考虑这些位:

> var a = 1;
undefined
> a <<= 3 + 23
67108864    // 0x000[00000100000000000000000000000000]
> a <<= 8
0           // 0x100[00000000000000000000000000000000]

方括号表示实际使用什么值来确定数字的值,左边的部分被丢弃。如您所见,您已经将 1 一直位移到数字左侧,导致 0 被遗留下来。

注意下面的代码片段,在到达第 32 个移位标记后,所有结果均为 0:

var a = 1;
for(var i = 1; i < 40; i++){
    a <<= 1;
    console.log(i, a);
}

关于如果位移太多,Javascript 数字将重置为 0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51386396/

相关文章:

javascript - 将带空格的字符串转换为不带空格的字符串和 camelCase javascript

javascript - Android 获取唯一的 firebase token 并使用云功能进行身份验证

javascript - 使用 jQuery 将 HTML <dl> 转换为嵌套的 JavaScript 数组

c++ - 如何从 8 个 boolean 值中创建一个字节(反之亦然)?

c++ - 从二进制文件中读取字节

c - 1 << 31不能用 'int'类型表示吗?

python - 返回 Python 中最低有效位的索引

javascript - jQuery 选项卡动画由 Controller 暂停和播放

javascript - 如何显示 DOM 元素

c++ - 设置和清除内存地址位