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

数字常量的打印类型导致溢出

数字常量的打印类型导致溢出

Go
慕侠2389804 2022-06-01 16:12:02
我是 Go 新手,目前正在关注A Tour of Go。我目前在页面Numeric Constants。下面是在该页面上运行的代码的精简版本:package mainimport "fmt"const Big = 1 << 100func needFloat(x float64) float64 {    return x * 0.1}func main() {    fmt.Println(needFloat(Big))    // fmt.Printf("Type of Big %T", Big)}此代码使用输出成功编译1.2676506002282295e+29但是,以下代码不会编译并给出错误:package mainimport "fmt"const Big = 1 << 100func needFloat(x float64) float64 {    return x * 0.1}func main() {    fmt.Println(needFloat(Big))    fmt.Printf("Type of Big %T", Big)}输出: ./prog.go:9:13: constant 1267650600228229401496703205376 overflows int你认为为什么会发生这种情况?我希望你能解释一下。
查看完整描述

3 回答

?
心有法竹

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

该常量Big是一个无类型常量。无类型常量可以任意大,并且不必符合任何预定义类型的限制。它在使用它的上下文中被解释和截断。

该函数needFloat得到一个float64参数。在这种情况下Big,转换为 afloat64并以这种方式使用。

当您将它用于Printf时,它会尝试将其作为 an 传入,int因为它不是十进制数(否则它会将其转换为 float64),并且会导致溢出。将它作为 float64(Big) 传递,它应该可以工作。


查看完整回答
反对 回复 2022-06-01
?
元芳怎么了

TA贡献1798条经验 获得超7个赞

我猜原因是它Big被计算了(即在传递给之前被强制转换needFloat,而是在 . 之前被计算为 int64 Printf。作为证明,以下语句计算正确:


package main

import "fmt"

const Big = 1 << 100


func main() {

    fmt.Printf("Type of Big %T", float64(Big))

}

希望这可以帮助。


查看完整回答
反对 回复 2022-06-01
?
翻翻过去那场雪

TA贡献2065条经验 获得超14个赞

无类型常量 n 必须先转换为类型,然后才能分配给 fmt.Println 调用中的 interface{} 参数。


fmt.Println(a ...interface{})

当无法从上下文中推断出类型时,无类型常量将根据常量的格式转换为 bool、int、float64、complex128、string 或 rune。


在这种情况下,常数是整数,但 n 大于 int 的最大值。


但是,n 可以表示为 float64。


const n = 9876543210 * 9876543210

fmt.Println(float64(n))

对于大数的精确表示,math/big 包实现了任意精度的算术。它支持有符号整数、有理数和浮点数。


这取自https://yourbasic.org/golang/gotcha-constant-overflows-int/。


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

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信