Go 将整型转换为字节

Go 将整型转换为字节,go,Go,真奇怪 它们都在将int转换为byte,所以它们都应该是错误的 但是案例1,2是可以的 这怎么可能呢?变量数值可以转换成更小的类型,而高位通常会丢失 编译器拒绝对常量值执行此操作(这显然总是一个错误)。这是(我的): 每项实施都必须: 表示至少256位的整数常量 表示浮点常量,包括复数常量的各部分,>尾数至少为256位,有符号二进制指数至少为16位 如果无法精确表示整型常量,请给出错误。 如果由于溢出而无法表示浮点或复数常量,请给出错误 如果由于精度限制而无法表示浮点或复常量,则四舍五入到最接

真奇怪

它们都在将int转换为byte,所以它们都应该是错误的

但是案例1,2是可以的


这怎么可能呢?

变量数值可以转换成更小的类型,而高位通常会丢失

编译器拒绝对常量值执行此操作(这显然总是一个错误)。这是(我的):

每项实施都必须:

  • 表示至少256位的整数常量
  • 表示浮点常量,包括复数常量的各部分,>尾数至少为256位,有符号二进制指数至少为16位
  • 如果无法精确表示整型常量,请给出错误。
  • 如果由于溢出而无法表示浮点或复数常量,请给出错误
  • 如果由于精度限制而无法表示浮点或复常量,则四舍五入到最接近的可表示常量
这些要求既适用于文字常量,也适用于计算常量表达式的结果。


因此,如果您将
var x
var y
更改为
const x
const y
,那么这四种情况下都会出现错误。

这就是语言的工作原理。请参考Go教程或常量语言规范。我希望您知道257确实溢出了一个字节。@Volker是的,我知道257确实溢出了一个字节。所以案例1,2好让我困惑代码中的注释令人困惑。这四个都是溢出,但最后两个是在编译过程中检测到的(正如@Volker所指出的,请参考语言规范)。前两个(
rv1
rv2
)也是溢出的(在运行时),因此它不正常。可能是重复的。@putu“不正常”的定义是什么?OP只是询问为什么最后两个案例会导致编译器错误,而前两个案例不会导致任何错误(并且都会打印数字1)
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