2 回答
TA贡献1829条经验 获得超7个赞
主要问题是基本数字类型无法处理这么大的数字。事实上,如果你只是尝试这样的事情:
x := 4254353345467546745674564564567445674658647567567853467867568756756785786785676858878978978978978907978977896789676786789655289890980889098835432453455544
构建将失败:42543...5544 overflows int
要做你正在寻找的东西,你需要做两件事:
将您的常量存储为可以处理此大小的东西
使用可以处理大量数字的数据类型
最简单的方法是第一个使用 string ,第二个使用big.Int:
package main
import (
"fmt"
"math/big"
)
func main() {
largeNum := "4254353345467546745674564564567445674658647567567853467867568756756785786785676858878978978978978907978977896789676786789655289890980889098835432453455544"
i, ok := big.NewInt(0).SetString(largeNum, 10)
if !ok {
panic("big.Int SetString failed")
}
fmt.Println(i)
fmt.Println(i.Bytes())
}
这将输出 big int 的base 10 字符串表示(与您输入的相同)和 big endian 字节顺序的字节:
4254353345467546745674564564567445674658647567567853467867568756756785786785676858878978978978978907978977896789676786789655289890980889098835432453455544
[81 58 216 146 57 48 179 246 202 93 83 128 121 181 65 161 52 211 183 127 131 99 227 65 100 227 35 171 8 45 246 240 131 6 183 2 149 204 10 62 88 195 78 51 233 238 225 162 144 75 54 210 134 17 37 22 20 217 213 213 67 96 62 184]
TA贡献1877条经验 获得超1个赞
其他答案很好,但我想添加更多关于为什么会发生这种情况的上下文。当您向 提供一个数字时string()
,Go 会将输入解释 为 Unicode 代码点。通常你会给出如下的十六进制输入:
package mainimport "fmt"func main() { { // example 1 s := string(0x1F600) t := fmt.Sprintf("%X", s) fmt.Println(t == "F09F9880") } { // example 2 s := string(0x10FFFF + 1) t := fmt.Sprintf("%X", s) fmt.Println(t == "EFBFBD") }}
UTF-8在十进制的 U+10FFFF、 AKA 0x10FFFF
、 AKA处达到最大值。1114111
因此,如果您为此付出任何代价(显然您已经这样做了),那么您就会EFBFBD
回来,即REPLACEMENT CHARACTER (U+FFFD)。
- 2 回答
- 0 关注
- 122 浏览
添加回答
举报