javascript - 如果 `number` 不存储为整数,JS 按位运算如何工作?
问题描述
据此, JavaScriptnumber
被存储为浮点值。那么一个整数值不是也分解成它的特征部分和尾数部分吗?如果是这样,按位运算符如何工作?100 >>1 正确给出 50。~2 正确给出 -3(2 的补码)。
我只是意识到我有一个使用“位掩码”的 5 年历史的应用程序。基本上,我使用 16 位模式让每个位代表不同的权限角色。因此,使用的值是从 0 到 65535。到目前为止,它一直运行良好。我想知道我是否需要先解决这个问题。
解决方案
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 )”进行逻辑否定。
推荐阅读
- consul - 由于模板中的 Consul KV 解析失败,Nomad 作业陷入待处理状态
- codeigniter - Codeigniter:分页链接未正确显示
- c# - 2张桌子之间的分配数量
- mysql - 为什么恢复表中索引的基数与原始表中的基数不同?
- artifactory - JFrog artifactory 下载 0 字节的文件
- html - 如何仅内联页面使用的 CSS 而不是加载整个框架?
- time - 一周中两年的时间序列
- android - Android 项目构建在 Bitrise 上失败并出现 safeargs 异常
- json - 使用 bash 将 `top` 的内容传递到 json 文件中的困难
- rust - 基于迭代器的代码与过程代码:如何让基于迭代器的算法更快?