为什么 ~-(2 + "2") 是 21?

Why ~-(2 + "2") is 21?

我在测试中看到了这个问题,但我不明白运算符是如何处理语句的。

let a = ~-(2 + "2");
console.log(a);

~-(2 + "2")
  • 0: 2 + "2"(串联)= "22"
  • 1: -"22"(强制)= -22
  • 2:~-22(按位非)= -(-22 + 1)= 21

Bitwise NOTing any number x yields -(x + 1). For example, ~-5 yields 4.

  • 第 1 步:(2+"2") 结果字符串 "22"
  • 第 2 步:-("22") 与 (-1)*("22") 相同,结果为 -22
  • 第 3 步:按位非 (~),结果为 21

要理解最后一步,您需要知道 JavaScript 将数字存储为 64 位浮点数,但所有按位运算都是使用 2 的补码对 32 位有符号整数执行的。

所以:

  • -22表示是+22的2的补码
  • +22 二进制 = 0000 0000 0000 0000 0000 0000 0001 0110
  • 2 对 (22) 的赞美 = (-22) = 1111 1111 1111 1111 1111 1111 1110 1001
    • 1 = 1111 1111 1111 1111 1111 1111 1110 1010
  • ~-22 = 按位不是 -22 = 0000 0000 0000 0000 0000 0000 0001 0101
  • 10101 二进制 = 21 十进制