谁能告诉我为什么输出不是-1而是18446744073709551615?
package main
import (
"fmt"
)
func main() {
a := uint(0)
b := uint(1)
fmt.Println(a - b)
}
输出
18446744073709551615
目前,我的理解如下。
pc中的减法将转换为加法。b 是负数,所以 a(0) 和 b(-1) 的 2 的补码将被添加使用。
所以计算就像
00000000 00000000 00000000 00000001 <- 2's complement of 0
11111111 11111111 11111111 11111110 <- 2's complement of -1
11111111 11111111 11111111 11111111 <- 2's complement of (result: 0 + -1)
通常,如果 a 和 b 是 int 类型,则 2 的补码将自动转换为二进制结果 (10000000 00000000 00000000 00000001),即 -1。但是a和b是单位的类型,所以不会转换成二进制,它会把11111111 11111111 11111111 11111111(2的补码)的结果当作正常的二进制结果输出。 ← 这个解释对吗?
我的理解是否遗漏了什么?
另一个问题是 11111111 11111111 11111111 11111111 应该是 pow(2,64) - 1 即 18446744073709552000
为什么我的输出只有 18446744073709551615?