去打印大量

ari*_*rik 6 integer-overflow biginteger go

我目前正在做 Go Lang 教程,准确地说是“数值常量”。示例代码以以下语句开头:

const (
    // Create a huge number by shifting a 1 bit left 100 places.
    // In other words, the binary number that is 1 followed by 100 zeroes.
    Big = 1 << 100
    // Shift it right again 99 places, so we end up with 1<<1, or 2.
    Small = Big >> 99
)
Run Code Online (Sandbox Code Playgroud)

常量Big显然很大,我正在尝试打印它及其类型,如下所示:

fmt.Printf("%T", Big)
fmt.Println(Big)
Run Code Online (Sandbox Code Playgroud)

但是,我对这两行都收到以下错误:

# 命令行参数 ./compile26.go:19: 常量 1267650600228229401496703205376 溢出 int

我会尝试将 Big 转换为其他类型,例如uint64,它溢出了相同的错误,或者只是将其转换为字符串,但是在尝试时Big.String()出现以下错误:

Big.String 未定义(int 类型没有字段或方法 String)

它的类型似乎是int,但我无法打印它或将其转换为任何内容,并且它会溢出所有方法。我如何处理这个数字/对象以及如何打印它?

Jim*_*imB 1

该值大于任何 64 位数字类型可以容纳的值,因此您无法直接操作它。

如果您需要编写只能通过math/big包操作的数字常量,则需要以包可以使用的格式将其序列化存储。最简单的方法可能是使用以 10 为基数的字符串:

https://play.golang.org/p/Mzwox3I2SL

bigNum := "1267650600228229401496703205376"
b, ok := big.NewInt(0).SetString(bigNum, 10)
fmt.Println(ok, b)
// true 1267650600228229401496703205376
Run Code Online (Sandbox Code Playgroud)