【发布时间】:2013-08-17 22:35:58
【问题描述】:
根据 ECMAScript 5.1 标准的 11.4.8 小节:
产生式 UnaryExpression : ~ UnaryExpression 评估如下:
- 让
expr成为评估UnaryExpression的结果。- 让
oldValue成为ToInt32(GetValue(expr))。- 将按位补码的结果返回到
oldValue。结果是一个带符号的 32 位整数。
~ 运算符将调用内部方法ToInt32。据我了解,ToInt32(1) 和 ToInt32(-1) 将返回相同的值 1 ,但为什么 ~-1 等于 0 和 ~1 等于 -2?
现在我的问题是为什么ToInt32(-1) 等于-1?
ECMAScript 5.1 标准的9.5 小节:
抽象操作 ToInt32 将其参数转换为 232 个整数值之一 在 -231 到 231-1 的范围内,包括端点。这个抽象操作的作用是 如下:
- 令 number 为对输入参数调用 ToNumber 的结果。
- 如果数字是 NaN、+0、-0、+∞ 或 -∞,则返回 +0。
- 让 posInt 为 sign(number) * floor(abs(number))。
- 令 int32bit 为 posInt 模 232;即 Number 的有限整数值 k 输入正号且幅度小于 232 使得数学 posInt 和 k 的差在数学上是 232 的整数倍。
- 如果int32bit大于等于231,返回int32bit-232,否则 返回 int32bit。
当参数为-1时,根据9.5, 在步骤 1 数字仍然是-1, 跳过步骤 2 在步骤 3 posInt 将为 -1 在第 4 步 int32bit 将为 1 在第 5 步中,它将返回 1
哪一步错了?
【问题讨论】:
-
ToIn32(-1) 应该根据ecma-international.org/ecma-262/5.1/#sec-9.5产生-1
-
您的理解是错误的,在您之前的问题中已得到纠正...(更具体地说,在我的回答中)
-
在查找有关波浪号的信息时发现这很有帮助。 javascriptturnsmeon.com/the-tilde-operator-in-javascript。基本上
~x === -(x + 1)
标签: javascript operators bitwise-operators ecmascript-5