BigInt位运算按32位有符号整数截断,算术运算保持任意精度;禁止与Number混用;右移>>和>>>行为相同,均向零取整。

JavaScript 中 BigInt 执行位运算和普通数值运算的行为有本质区别:位运算是按 32 位带符号整数语义截断处理的,而算术运算是任意精度的;这会导致看似矛盾的结果。
位运算会自动转为 32 位有符号整数
BigInt 在执行 &、|、^、、<code>>>、>>> 等位运算时,**不会保持大整数精度**。引擎会先将 BigInt 值模 2³²,再转为 32 位有符号整数(即等价于 Number(value) & 0xFFFFFFFF | 0),然后运算,最后转回 BigInt。
1n 结果是 <code>0n(因为1 超出 32 位,被截断为 0)-
0x100000001n & 0xFFFFFFFFn得到1n(高位被丢弃,只保留低 32 位) -
-1n >> 1n是-1n(与-1 >> 1 === -1一致,不是数学右移)
算术运算保持任意精度
加减乘除幂取模等操作对 BigInt 完全按大整数规则执行,无精度损失:
-
9007199254740991n + 1n正确得9007199254740992n(而Number已超出安全整数) -
2n ** 100n可精确计算,结果是 127 位长的整数 -
123456789012345678901234567890n % 1000n返回890n,严格按模运算定义
不能混用 BigInt 和 Number 进行位运算
JavaScript 明确禁止 BigInt 与 Number 在位运算中混合使用,会立即抛出 TypeError:
立即学习“Java免费学习笔记(深入)”;
-
1n & 2→ 报错:TypeError: Cannot mix BigInt and other types -
1n + 2同样报错(但+是算术运算符,此处也禁止隐式转换) - 必须显式统一类型:
1n & 2n或BigInt(1) & BigInt(2)
右移运算符的特殊语义
BigInt 的 >>(算术右移)和 >>>(无符号右移)**行为相同**,都执行“向零取整的右移”,不区分符号位:
-
-8n >> 1n→-4n(不是补码意义的算术右移) -
-8n >>> 1n→ 同样是-4n(规范强制二者等价) - 这是因为 BigInt 没有固定位宽和符号位概念,右移定义为
floor(x / 2^y)
本质上,BigInt 位运算只是为兼容历史 API 提供的有限能力,真正需要高精度位操作(如密码学、大数哈希)时,应使用专用库或自行实现基于数组的位运算逻辑。不复杂但容易忽略。


















