Golang 溢出 int64
Golang overflows int64
我尝试使用此代码,但出现错误:常量 100000000000000000000000 溢出 int64
我该如何解决?
// Initialise big numbers with small numbers
count, one := big.NewInt(100000000000000000000000), big.NewInt(1)
例如:
count,one := new(big.Int), big.NewInt(1)
count.SetString("100000000000000000000000",10)
它不会工作,因为在幕后,big.NewInt 实际上正在分配一个 int64。您要分配到 big.NewInt 中的数字需要超过 64 位才能存在,因此它失败了。
但是,如果你想在 MaxInt64 以下添加两个大数,那么有多大的工程,你可以这样做!即使总和大于 MaxInt64。这是我刚刚写的一个例子 (http://play.golang.org/p/Jv52bMLP_B):
func main() {
count := big.NewInt(0);
count.Add( count, big.NewInt( 5000000000000000000 ) );
count.Add( count, big.NewInt( 5000000000000000000 ) );
//9223372036854775807 is the max value represented by int64: 2^63 - 1
fmt.Printf( "count: %v\nmax int64: 9223372036854775807\n", count );
}
这导致:
count: 10000000000000000000
max int64: 9223372036854775807
现在,如果您仍然对 NewInt 的幕后工作方式感到好奇,这里是您正在使用的函数,摘自 Go 的文档:
// NewInt allocates and returns a new Int set to x.
func NewInt(x int64) *Int {
return new(Int).SetInt64(x)
}
来源:
我尝试使用此代码,但出现错误:常量 100000000000000000000000 溢出 int64
我该如何解决?
// Initialise big numbers with small numbers
count, one := big.NewInt(100000000000000000000000), big.NewInt(1)
例如:
count,one := new(big.Int), big.NewInt(1)
count.SetString("100000000000000000000000",10)
它不会工作,因为在幕后,big.NewInt 实际上正在分配一个 int64。您要分配到 big.NewInt 中的数字需要超过 64 位才能存在,因此它失败了。
但是,如果你想在 MaxInt64 以下添加两个大数,那么有多大的工程,你可以这样做!即使总和大于 MaxInt64。这是我刚刚写的一个例子 (http://play.golang.org/p/Jv52bMLP_B):
func main() {
count := big.NewInt(0);
count.Add( count, big.NewInt( 5000000000000000000 ) );
count.Add( count, big.NewInt( 5000000000000000000 ) );
//9223372036854775807 is the max value represented by int64: 2^63 - 1
fmt.Printf( "count: %v\nmax int64: 9223372036854775807\n", count );
}
这导致:
count: 10000000000000000000
max int64: 9223372036854775807
现在,如果您仍然对 NewInt 的幕后工作方式感到好奇,这里是您正在使用的函数,摘自 Go 的文档:
// NewInt allocates and returns a new Int set to x.
func NewInt(x int64) *Int {
return new(Int).SetInt64(x)
}
来源: