为什么 ^1 等于 -2?
Why does ^1 equal -2?
fmt.Println(^1)
为什么打印 -2
?
好的,这与我们在计算中使用符号的方式有关。
对于一个1字节的数,可以得到
D
B
-8
1000
-7
1001
-6
1010
-5
1011
-4
1100
-3
1101
-2
1110
-1
1111
0
0000
1
0001
2
0010
3
0011
4
0100
5
0101
6
0110
7
0111
你可以在这里看到 1 等于 0001(没有变化)但是 -1 等于 1111。^
运算符执行按位异或运算。因此:
0001
1111 xor
-------
1110 -> That is actually -2.
这一切都是因为我们用来计算负数的two complement约定。当然,这可以外推到更长的二进制数。
您可以使用 windows 计算器进行异或按位计算来测试。
^
运算符是位补运算符。 Spec: Arithmetic operators:
For integer operands, the unary operators +
, -
, and ^
are defined as follows:
+x is 0 + x
-x negation is 0 - x
^x bitwise complement is m ^ x with m = "all bits set to 1" for unsigned x
and m = -1 for signed x
所以 1
在二进制中是单个 1 位,前面全是零:
0000000000000000000000000000000000000000000000000000000000000001
所以按位补码是一个单独的 0 位,前面是全 1:
1111111111111111111111111111111111111111111111111111111111111110
^1
是一个无类型常量表达式。当它被传递给一个函数时,它必须被转换为一个类型。由于 1
是一个无类型整数 constant, its default type int
will be used. int
in Go is represented using the 2's complement,其中负数以 1
开头。整数为-1
,小一(二进制)为-2
等
上面的位模式是-2
的2的补码表示。
要打印位模式和类型,请使用此代码:
fmt.Println(^1)
fmt.Printf("%T\n", ^1)
fmt.Printf("%064b\n", 1)
i := ^1
fmt.Printf("%064b\n", uint(i))
它输出(在 Go Playground 上尝试):
-2
int
0000000000000000000000000000000000000000000000000000000000000001
1111111111111111111111111111111111111111111111111111111111111110
fmt.Println(^1)
为什么打印 -2
?
好的,这与我们在计算中使用符号的方式有关。
对于一个1字节的数,可以得到
D | B |
---|---|
-8 | 1000 |
-7 | 1001 |
-6 | 1010 |
-5 | 1011 |
-4 | 1100 |
-3 | 1101 |
-2 | 1110 |
-1 | 1111 |
0 | 0000 |
1 | 0001 |
2 | 0010 |
3 | 0011 |
4 | 0100 |
5 | 0101 |
6 | 0110 |
7 | 0111 |
你可以在这里看到 1 等于 0001(没有变化)但是 -1 等于 1111。^
运算符执行按位异或运算。因此:
0001
1111 xor
-------
1110 -> That is actually -2.
这一切都是因为我们用来计算负数的two complement约定。当然,这可以外推到更长的二进制数。
您可以使用 windows 计算器进行异或按位计算来测试。
^
运算符是位补运算符。 Spec: Arithmetic operators:
For integer operands, the unary operators
+
,-
, and^
are defined as follows:+x is 0 + x -x negation is 0 - x ^x bitwise complement is m ^ x with m = "all bits set to 1" for unsigned x and m = -1 for signed x
所以 1
在二进制中是单个 1 位,前面全是零:
0000000000000000000000000000000000000000000000000000000000000001
所以按位补码是一个单独的 0 位,前面是全 1:
1111111111111111111111111111111111111111111111111111111111111110
^1
是一个无类型常量表达式。当它被传递给一个函数时,它必须被转换为一个类型。由于 1
是一个无类型整数 constant, its default type int
will be used. int
in Go is represented using the 2's complement,其中负数以 1
开头。整数为-1
,小一(二进制)为-2
等
上面的位模式是-2
的2的补码表示。
要打印位模式和类型,请使用此代码:
fmt.Println(^1)
fmt.Printf("%T\n", ^1)
fmt.Printf("%064b\n", 1)
i := ^1
fmt.Printf("%064b\n", uint(i))
它输出(在 Go Playground 上尝试):
-2
int
0000000000000000000000000000000000000000000000000000000000000001
1111111111111111111111111111111111111111111111111111111111111110