2的补码和IEEE754的关系是什么?

4

我曾经认为所有数字都是以2的补码格式存储在计算机中。并且在2的补码中不存在-0。但在IEEE754中,既有+0也有-0。我看到JavaScript中所有数字都是IEEE754,所以我现在感到困惑。此外,在JavaScript中,~a = -a -1。我曾经认为这是由于数字a的2的补码发生了变化。但如果JavaScript中的每个数字都存储为IEEE754,那么我们如何将其转换为2的补码呢?


@Pointy 谢谢。所以在JavaScript中,整数值也被表示为浮点值,这些浮点值是用IEEE754表示的,这是正确的吗? - T.T
@Pointy 所以使用 ~ 运算符时,计算出的32位整数值是从原始的双精度浮点值计算出来的,对吗? - T.T
@JörgWMittag 但是使用IEEE754,它如何使 ~a = -a+1? - T.T
是的,没错。只要使用“普通”数字进行常规数学运算,中间的整数值就会被转换回浮点数。 - Pointy
3
你引用的文字中提到了“整数值”。JavaScript确实有整数值。它使用IEEE-754浮点类型来表示数字,其格式能够表示许多整数 - Eric Postpischil
显示剩余4条评论
1个回答

4
JavaScript秘诀:它使用IEEE-754基本的64位二进制浮点格式表示数字,但将它们转换为32位整数进行位运算,然后再转换回来。
JavaScript是ECMAScript的一个实现。ECMAScript 2018语言规范(第9版,2018年6月)在第12.5.8条款中指定了一元 ~ 运算符(在目录中显示为12.5.10,但在正文中为12.5.8)。相关部分如下:
UnaryExpression: ~ UnaryExpression 1. 计算UnaryExpression的结果并将其存储在expr中。 2. 让oldValue等于 ? ToInt32(? GetValue(expr))。 3. 返回应用按位补码到oldValue的结果。结果是一个有符号的32位整数。
ToInt32操作将数字截断为整数(去除任何小数部分,向零舍入),然后将该数字映射到[-2^31,+2^31)模2^32的区间。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接