3 回答
TA贡献1842条经验 获得超13个赞
从这个评论:
我的目标是将更大的 = 9223372036854775808543522345 转换为二进制形式
我们发现您的问题是XY 问题。
由于我们确实知道常量超过 64 位,因此我们需要将其分解为多个 64 位字,或者将其存储在某种更大的整数存储中。
Go 提供math/big了通用的大数运算,或者在这种情况下,我们可以利用这样一个事实,即在一个struct保存两个 64 位整数(其中至少有一个是未签名的)。
这个相当简单的程序打印转换为二进制的结果:
500000000 x 2-sup-64 + 543522345 as binary:
111011100110101100101000000000000000000000000000000000000000000100000011001010111111000101001
package main
import "fmt"
const (
// Much larger value than int64.
bigger = 9223372036854775808543522345
d64 = 1 << 64
)
type i128 struct {
Upper int64
Lower uint64
}
func main() {
x := i128{Upper: bigger / d64, Lower: bigger % d64}
fmt.Printf("%d x 2-sup-64 + %d as binary:\n%b%.64b\n", x.Upper, x.Lower, x.Upper, x.Lower)
}
TA贡献1803条经验 获得超3个赞
没有,它是一个无类型的常量。因为您没有将它分配给任何变量或在任何表达式中使用它,所以它还没有“需要”被赋予任何具体类型的表示。Go 中的数字常量实际上具有无限精度(语言规范要求整数至少为 256 位,浮点数至少为 256 位尾数,但我相信golang/go编译器在内部使用 Go 任意精度类型仅受内存限制)。请参阅语言规范中有关常量的部分。
如果不能将常量分配给任何类型的变量,那么常量有什么用?好吧,它可以是常量表达式的一部分。常量表达式以任意精度计算,并且它们的结果可以分配给一个变量。换句话说,只要所有计算发生在编译时,就可以使用太大而无法表示的值来获得可表示的答案。
TA贡献1811条经验 获得超5个赞
- 3 回答
- 0 关注
- 622 浏览
添加回答
举报
