2015-06-14 2 views
4

Я пытаюсь использовать этот код, но дает мне ошибку: постоянное 100000000000000000000000 переполнения int64Golang перетекает int64

Как я могу исправить это?

// Initialise big numbers with small numbers 
count, one := big.NewInt(100000000000000000000000), big.NewInt(1) 

ответ

2

Это не будет работать, потому что под капотом, big.NewInt фактически выделяя в int64. Число, которое вы хотите выделить в большой.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) 
} 

Источники:

https://golang.org/pkg/math/big/#NewInt

https://golang.org/src/math/big/int.go?s=1058:1083#L51

Смежные вопросы