首页 > 解决方案 > 如果 `number` 不存储为整数,JS 按位运算如何工作?

问题描述

据此 JavaScriptnumber被存储为浮点值。那么一个整数值不是也分解成它的特征部分和尾数部分吗?如果是这样,按位运算符如何工作?100 >>1 正确给出 50。~2 正确给出 -3(2 的补码)。

我只是意识到我有一个使用“位掩码”的 5 年历史的应用程序。基本上,我使用 16 位模式让每个位代表不同的权限角色。因此,使用的值是从 0 到 65535。到目前为止,它一直运行良好。我想知道我是否需要先解决这个问题。

标签: javascriptfloating-pointieee-754

解决方案


JavaScript 实现将每个浮点表示转换为 32 位整数并应用位运算符。

JavaScript 是 ECMAScript 的一个实现。ECMAScript 2020 语言规范在第 6.1.6.1.16 节中描述了双操作数按位运算,其中显示每个操作数都使用ToInt32函数转换为整数。(这是规范中的抽​​象操作,不一定是实现中的实际功能。)第 7.1.6 节描述了该ToInt32操作。对于无穷大,它返回零。否则,它会有效地丢弃小数部分并返回有符号整数部分的低 32 位(将它们视为二进制补码)。

单操作数~运算符在 6.1.6.1.2 中单独讨论,但也适用ToInt32于其操作数。

关于 ECMAScript 规范的两个注意事项

该链接是通用的;将来它可能会更新到更高版本而不是 2020 版本。

不寻常的“!” 和 ”?” 在第 5.2.3.4 节“ReturnIfAbrupt Shorthands”中描述了操作描述。所以 ”!ToInt32( x )”在文中说要按照一定的规则执行“ToInt32( x )”,而不是对“ToInt32( x )”进行逻辑否定。


推荐阅读