为什么〜-1等于0且〜1等于-2?

use*_*304 5 javascript operators bitwise-operators ecmascript-5

根据ECMAScript 5.1标准的第11.4.8小节:

生产UnaryExpression:~ UnaryExpression的计算方法如下:

  1. 让我们expr来评估UnaryExpression.
  2. 我们oldValueToInt32(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 modulo 2 32 ; 也就是说,具有正号并且幅度小于2 32的数字类型的有限整数值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

哪一步错了?

Hie*_* Le 16

所述-1在32位的整数

1111 1111 1111 1111 1111 1111 1111 1111
Run Code Online (Sandbox Code Playgroud)

所以~-1

0000 0000 0000 0000 0000 0000 0000 0000
Run Code Online (Sandbox Code Playgroud)

哪个是零.

所述1在32位的整数

0000 0000 0000 0000 0000 0000 0000 0001
Run Code Online (Sandbox Code Playgroud)

所以~1

1111 1111 1111 1111 1111 1111 1111 1110
Run Code Online (Sandbox Code Playgroud)

这是-2.

你应该阅读两个补码来理解二进制基数中负整数的显示.