6

根据ECMAScript 5.1 标准的11.4.8小节:

产生式 UnaryExpression : ~ UnaryExpression的评估如下:

  1. expr是评估UnaryExpression的结果。
  2. 让。oldValue_ToInt32(GetValue(expr))
  3. 返回对 应用按位补码的结果oldValue。结果是一个有符号的 32 位整数。

操作员将~调用内部方法ToInt32。在我的理解中ToInt32(1),并且ToInt32(-1)会返回相同的值 1 ,但是为什么~-1等于 0 和~1等于 -2 呢?

现在我的问题是为什么ToInt32(-1)等于-1?ECMAScript 5.1 标准的第9.5小节:

抽象操作 ToInt32 将其参数转换为-2 31到 2 31 -1范围内的 2 32 个整数值之一,包括端点。这个抽象操作的作用如下:

  1. 令 number 为对输入参数调用 ToNumber 的结果。
  2. 如果 number 为 NaN、+0、-0、+∞ 或 -∞,则返回 +0。
  3. 让 posInt 为 sign(number) * floor(abs(number))。
  4. 令 int32bit 为 posInt 模 2 32;也就是说,具有正号且幅度小于 2 32的 Number 类型的有限整数值 k使得 posInt 和 k 的数学差在数学上是 2 32的整数倍。
  5. 如果 int32bit 大于等于 2 31,则返回 int32bit − 2 32,否则返回 int32bit 。

当参数为 -1 时,根据 9.5,在第 1 步中编号仍为 -1,在第 3 步中跳过第 2 步 posInt 在第 4 步中为 -1 int32bit 在第 5 步中为 1 它将返回 1

哪一步错了?

4

3 回答 3

17

32-1位整数

1111 1111 1111 1111 1111 1111 1111 1111

~-1也会如此

0000 0000 0000 0000 0000 0000 0000 0000

这是零。

321位整数

0000 0000 0000 0000 0000 0000 0000 0001

~1也会如此

1111 1111 1111 1111 1111 1111 1111 1110

这是-2

您应该阅读二进制补码以了解以二进制为基础的负整数的显示。

于 2013-08-15T17:07:32.000 回答
1

你从哪里得到ToInt32(-1)评估为 1 的想法?它的计算结果为 -1,在 32 位二进制补码表示中,所有位都设置为 1。当您应用~运算符时,每个位都变为 0,这是 0 在 32 位二进制补码二进制中的表示.

1 的表示是除位 0 之外的所有位 0。当位反转时,结果是除位 0 之外的所有位 1。这恰好是 -2 的二进制补码表示。(要看到这一点,只需从 -1 的二进制补码表示中减去 1。)

于 2013-08-15T17:07:42.187 回答
0
  • ToInt32(1)将返回1
  • ToInt32(-1)将返回-1
  • -1通过设置所有 32 位来表示为带符号的 32 位整数。它的按位补码是所有位清除的,因此~-1产生0
  • 1表示为带符号的 32 位整数,除底部位外,所有位都清零。它的按位补码设置了除底部位之外的所有位,底部位是 value 的有符号 32 位整数表示-2。因此,~1产量-2
于 2013-08-15T17:09:06.617 回答