为了账号安全,请及时绑定邮箱和手机立即绑定

64位最大值

64位最大值

Go
繁花如伊 2022-05-23 16:42:52
下面的代码编译:package mainimport "fmt"const (    // Max integer value on 64 bit architecture.    maxInt = 9223372036854775807    // Much larger value than int64.    bigger = 9223372036854775808543522345    // Will NOT compile    // biggerInt int64 = 9223372036854775808543522345)func main() {    fmt.Println("Will Compile")    //fmt.Println(bigger) // error}类型是内存中的大小+该内存中位的表示bigger编译时分配给的隐式类型是什么?因为constant 9223372036854775808543522345 overflows int线路错误fmt.Println(bigger)
查看完整描述

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)

}


查看完整回答
反对 回复 2022-05-23
?
繁星点点滴滴

TA贡献1803条经验 获得超3个赞

没有,它是一个无类型的常量。因为您没有将它分配给任何变量或在任何表达式中使用它,所以它还没有“需要”被赋予任何具体类型的表示。Go 中的数字常量实际上具有无限精度(语言规范要求整数至少为 256 位,浮点数至少为 256 位尾数,但我相信golang/go编译器在内部使用 Go 任意精度类型仅受内存限制)。请参阅语言规范中有关常量的部分

如果不能将常量分配给任何类型的变量,那么常量有什么用?好吧,它可以是常量表达式的一部分。常量表达式以任意精度计算,并且它们的结果可以分配给一个变量。换句话说,只要所有计算发生在编译时,就可以使用太大而无法表示的值来获得可表示的答案。


查看完整回答
反对 回复 2022-05-23
?
四季花海

TA贡献1811条经验 获得超5个赞

这些是无类型的常量。它们比类型化常量有更大的限制:

https://golang.org/ref/spec#Constants

尤其:

表示至少 256 位的整数常量。


查看完整回答
反对 回复 2022-05-23
  • 3 回答
  • 0 关注
  • 622 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号