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
Run Code Online (Sandbox Code Playgroud)
它很奇怪.
所有这些都将int转换为byte,因此所有这些都应该是错误的.
但案例1,2还可以!
怎么可能?
可变数值可以转换为较小的类型,正常的高位丢失.
编译器拒绝为常量值执行此操作(显然始终是错误).这是规范要求(强调我的):
每个实施都必须:
- 表示至少256位的整数常量.
- 表示浮点常数,包括复数常量的部分,>尾数至少为256位,有符号二进制指数至少为16位.
- 如果无法精确表示整数常量,则给出错误.
- 如果由于溢出而无法表示浮点或复数常量,则给出错误.
- 如果由于精度限制而无法表示浮点或复数常量,则舍入到最接近的可表示常量.
这些要求既适用于文字常量,也适用于评估常量表达式的结果.
因此,如果您更改var x并var y转到const x和const y,则会收到所有四种情况的错误.