在A Tour of Go 的Numeric Constants部分中,代码是package mainimport "fmt"const ( // Create a huge number by shifting a 1 bit left 100 places. // In other words, the binary number that is 1 followed by 100 zeroes. Big = 1 << 100 // Shift it right again 99 places, so we end up with 1<<1, or 2. Small = Big >> 99)func needInt(x int) int { return x*10 + 1 }func needFloat(x float64) float64 { return x * 0.1 }func main() { fmt.Println(needInt(Small)) fmt.Println(needFloat(Small)) fmt.Println(needFloat(Big)) fmt.Println(Big * 0.1) //one fmt.Println(Big / 10) //two}fmt.Println(Big*0.1)输出1.2676506002282295e+29,但fmt.Println(Big / 10)抛出错误:constant 126765060022822940149670320537 overflows int,它们之间有什么区别。
1 回答
沧海一幻觉
TA贡献1824条经验 获得超5个赞
来自关于常量的 Go :
数字常量存在于任意精度的数字空间中;它们只是普通数字。但是,当将它们分配给变量时,该值必须能够适合目标。
一个例子可能会让这一点更清楚:
const f = 1 << 31
x := f / 10 // what type is x?
y := f * 0.1 // what type is y?
fmt.Printf(" 10 : type = %8T\n", 10) // int
fmt.Printf("0.1 : type = %8T\n\n", 0.1) // float64
fmt.Printf(" x : type = %8T value = %v\n", x, x)
fmt.Printf(" y : type = %8T value = %v\n", y, y)
游乐场输出:
10 : type = int
0.1 : type = float64
x : type = int value = 214748364
y : type = float64 value = 2.147483648e+08
x
是 anint
因为 devisor10
被解释为 anint
。y
是 afloat64
因为乘数0.1
被解释为 afloat64
。
在游览示例中,const 是1<<100
,它太大而无法放入int
(32 位),因此程序甚至无法编译,因为该数字无法存储到分配的内存类型中:100 位无法放入32 位int
.
- 1 回答
- 0 关注
- 115 浏览
添加回答
举报
0/150
提交
取消