3 回答
TA贡献1866条经验 获得超5个赞
该常量Big
是一个无类型常量。无类型常量可以任意大,并且不必符合任何预定义类型的限制。它在使用它的上下文中被解释和截断。
该函数needFloat
得到一个float64
参数。在这种情况下Big
,转换为 afloat64
并以这种方式使用。
当您将它用于Printf
时,它会尝试将其作为 an 传入,int
因为它不是十进制数(否则它会将其转换为 float64),并且会导致溢出。将它作为 float64(Big) 传递,它应该可以工作。
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))
}
希望这可以帮助。
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/。
- 3 回答
- 0 关注
- 88 浏览
添加回答
举报