首页 > 解决方案 > 2的补码和IEEE754有什么关系?

问题描述

我曾经认为所有数字都以 2 的补码格式存储在计算机中。并且 2 的补码中没有 -0。但在 IEEE754 中,既有 +0 又有 -0。我在 JavaScript 中读到,所有数字都是 IEEE754。所以现在我很困惑。更重要的是,在 JavaScript 中,~a = -a -1。我以前以为是数字a的2补码变化引起的。但是如果 JavaScript 中的每个数字都存储为 IEEE754,我们如何将其转换为 2 的补码呢?

标签: javascriptfloating-pointieee-754twos-complement

解决方案


JavaScript 秘籍:它使用 IEEE-754 基本 64 位二进制浮点格式表示数字,但将它们转换为 32 位整数以进行按位运算,然后再将它们转换回来。

JavaScript 是 ECMAScript 的一个实现。ECMAScript 2018 语言规范(第 9版,2018 年 6 月)在第 12.5.8 条中指定了一元运算符(在目录中显示为 12.5.10,但在文本中显示为 12.5.8!)~相关部分是:

一元表达式 : ~ 一元表达式
1. 令 expr 为计算 UnaryExpression 的结果。
2. 让 oldValue 为 ? ToInt32(?GetValue(expr))。
3. 返回对 oldValue 应用按位补码的结果。结果是一个有符号的 32 位整数。

ToInt32操作将数字截断为整数(删除任何小数部分,向零舍入),然后将数字映射到模 2 32的区间 [-2 31 , +2 31 ) 。


推荐阅读