将int转换为byte

bin*_*bin 2 go

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还可以!

怎么可能?

Pet*_*ter 9

可变数值可以转换为较小的类型,正常的高位丢失.

编译器拒绝为常量值执行此操作(显然始终是错误).这是规范要求(强调我的):

每个实施都必须:

  • 表示至少256位的整数常量.
  • 表示浮点常数,包括复数常量的部分,>尾数至少为256位,有符号二进制指数至少为16位.
  • 如果无法精确表示整数常量,则给出错误.
  • 如果由于溢出而无法表示浮点或复数常量,则给出错误.
  • 如果由于精度限制而无法表示浮点或复数常量,则舍入到最接近的可表示常量.

这些要求既适用于文字常量,也适用于评估常量表达式的结果.

因此,如果您更改var xvar y转到const xconst y,则会收到所有四种情况的错误.