-3

谁能告诉我为什么输出不是-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?

4

2 回答 2

1

只是为了回答“另一个问题”:

...应该是 pow(2,64) - 1 即 18446744073709552000
为什么我的输出只有 18446744073709551615?

2 64 - 118446744073709551615。

如果你得到 18446744073709552000,我猜你是从使用十进制浮点表示的计算器中得到的,并且没有足够的精度数字来准确表示它。

(标准二进制浮点格式将 1844674407370955161 6作为最接近的可表示答案。)

顺便说一句:2 64 - 1 不可能等于 18446744073709552000,因为出于显而易见的原因,2 的幂是偶数,所以 2 N - 1 一定是奇数。

于 2021-08-07T12:57:12.363 回答
1

uint64 是所有无符号 64 位整数的集合。范围:0 到 18446744073709551615。

于 2021-08-07T10:37:58.693 回答