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

我是 Go 新手,目前正在关注A Tour of Go。


我目前在页面Numeric Constants。下面是在该页面上运行的代码的精简版本:


package main

import "fmt"

const Big = 1 << 100

func 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 main

import "fmt"

const Big = 1 << 100

func 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


你认为为什么会发生这种情况?我希望你能解释一下。


慕侠2389804
浏览 89回答 3
3回答

心有法竹

该常量Big是一个无类型常量。无类型常量可以任意大,并且不必符合任何预定义类型的限制。它在使用它的上下文中被解释和截断。该函数needFloat得到一个float64参数。在这种情况下Big,转换为 afloat64并以这种方式使用。当您将它用于Printf时,它会尝试将其作为 an 传入,int因为它不是十进制数(否则它会将其转换为 float64),并且会导致溢出。将它作为 float64(Big) 传递,它应该可以工作。

元芳怎么了

我猜原因是它Big被计算了(即在传递给之前被强制转换needFloat,而是在 . 之前被计算为 int64 Printf。作为证明,以下语句计算正确:package mainimport "fmt"const Big = 1 << 100func main() {&nbsp; &nbsp; fmt.Printf("Type of Big %T", float64(Big))}希望这可以帮助。

翻翻过去那场雪

无类型常量 n 必须先转换为类型,然后才能分配给 fmt.Println 调用中的 interface{} 参数。fmt.Println(a ...interface{})当无法从上下文中推断出类型时,无类型常量将根据常量的格式转换为 bool、int、float64、complex128、string 或 rune。在这种情况下,常数是整数,但 n 大于 int 的最大值。但是,n 可以表示为 float64。const n = 9876543210 * 9876543210fmt.Println(float64(n))对于大数的精确表示,math/big 包实现了任意精度的算术。它支持有符号整数、有理数和浮点数。这取自https://yourbasic.org/golang/gotcha-constant-overflows-int/。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go