为什么 ~-(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
十进制
我在测试中看到了这个问题,但我不明白运算符是如何处理语句的。
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
- 1 =
~-22
= 按位不是 -22 =0000 0000 0000 0000 0000 0000 0001 0101
10101
二进制 =21
十进制