Go语言 如何从两个半中检索更大的int?

oxiaedzo  于 2023-04-18  发布在  Go
关注(0)|答案(2)|浏览(122)

下面是代码:

package main

import (
    "fmt"
    "math"
)

type BiggerInt struct {
    Upper int64
    Lower int64
}

const (
    bigger    = 9223372036854775808543522345
    divisor64 = 1 << 64
)

func main() {
    var x BiggerInt
    x.Upper = bigger / divisor64
    x.Lower = bigger % divisor64
    fmt.Println(x.Lower + (x.Upper * int64(math.Pow(2, 64)))) // expecting 9223372036854775808543522345, got: 543522345
}

如何从x.Lowerx.Upper中检索更大的int?

4dc9hkyq

4dc9hkyq1#

重要的是要注意,const数字是无类型的,并且将根据上下文应用类型。

const (
    bigger    = 9223372036854775808543522345
    divisor64 = 1 << 64
)

这两个数字都不适合go的最大的int64整数类型,但是下面的数学:

var x BiggerInt
x.Upper = bigger / divisor64  // resolved at compile-time ...
x.Lower = bigger % divisor64  // ... so will fit into `int64`

避免了任何溢出问题,因为赋值在编译时解决,并且适合int64类型。
尝试将其重构为原始的(无类型的bigger)是不可能的,因为任何基本的go类型(没有int128)。因此,使用标准库的math/big包:

import "math/big"

t := big.NewInt(upper)
t.Lsh(t, 64)
t.Add(t, big.NewInt(lower))

fmt.Println(t) // 9223372036854775808543522345

https://go.dev/play/p/bHTOssconQa

h43kikqp

h43kikqp2#

不清楚你期望的是什么,但如果你不知道,math/big包实现了任意精度的算术(大数字)。

package main

import (
    "fmt"
    "math/big"
)

type BiggerInt struct {
    Upper int64
    Lower int64
}

const (
    bigger    = 9223372036854775808543522345
    divisor64 = 1 << 64
)

func main() {
    var x BiggerInt
    x.Upper = bigger / divisor64
    x.Lower = bigger % divisor64

    result := &big.Int{}
    result.Lsh(big.NewInt(x.Upper), 64)
    result.Add(result, big.NewInt(x.Lower))
    fmt.Println(result)
    // output:
    //  9223372036854775808543522345
}

相关问题