将int转换为byte

时间:2017-09-29 12:01:22

标签: 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 

很奇怪。

所有这些都将int转换为byte,因此所有这些都应该是错误的。

但案例1,2没问题!

怎么可能?

1 个答案:

答案 0 :(得分:5)

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

编译器拒绝为常量值执行此操作(显然始终是错误)。这是required by the spec(强调我的):

  

每个实施都必须:

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

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

因此,如果您将var xvar y更改为const xconst y,则会出现所有四种情况的错误。