【问题标题】:What is the relationship between 2’s complement and IEEE754?2的补码和IEEE754有什么关系?
【发布时间】:2018-11-23 18:29:40
【问题描述】:

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

【问题讨论】:

  • 2 的补码是 integer 值的表示方式。浮点值是另一种原生格式,其值表示二进制指数表示法。
  • @Pointy 谢谢。那么在 JavaScript 中,整数值也表示为浮点值,表示为 IEEE754 是否正确?
  • 那么 JavaScript 数字总是双精度浮点值。在使用 ~| 等布尔运算符评估子表达式的过程中,使用 32 位整数值,但一旦将值保存在变量或对象属性中,它始终是浮点值。
  • “那么,在 JavaScript 中,整数值也被表示为浮点值是正确的吗?”——不,在 JavaScript 中没有整数
  • @JörgWMittag:你引用的文字是“整数值”。 JavaScript 确实有整数值。它使用 IEEE-754 浮点 type 来表示数字,其格式能够表示许多整数

标签: javascript floating-point ieee-754 twos-complement


【解决方案1】:

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

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

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

ToInt32 操作将数字截断为整数(删除任何小数部分,向零舍入),然后将数字映射到区间 [−231, +231 ) 模 232.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-06
    • 2011-06-03
    • 2016-04-23
    • 2015-02-28
    • 1970-01-01
    相关资源
    最近更新 更多