var x uint64 = 257
var y int = 257
fmt.Println("rv1 is ", byte(x)) // ok
fmt.Println("rv2 is ", byte(y)) // ok
fmt.Println("rv3 is ", byte(257)) // constant 257 overflows byte
fmt.Println("rv4 is ", byte(int(257))) // constant 257 overflows byte
很奇怪。
所有这些都将int转换为byte,因此所有这些都应该是错误的。
但案例1,2没问题!
怎么可能?
答案 0 :(得分:5)
可变数值可以转换为较小的类型,正常丢失高位。
编译器拒绝为常量值执行此操作(显然始终是错误)。这是required by the spec(强调我的):
每个实施都必须:
- 表示至少256位的整数常量。
- 表示浮点常数,包括复数常数的部分,>尾数至少为256位,有符号二进制指数至少为16位。
- 如果无法准确表示整数常量,则会出错。
- 如果由于溢出而无法表示浮点或复数常量,则给出错误。
- 如果由于精度限制而无法表示浮点或复数常量,则舍入到最接近的可表示常量。
这些要求既适用于文字常量,也适用于评估常量表达式的结果。
因此,如果您将var x
和var y
更改为const x
和const y
,则会出现所有四种情况的错误。