Go 为什么在此代码中发生常量18446744073709551616溢出uint64?

Go 为什么在此代码中发生常量18446744073709551616溢出uint64?,go,overflow,Go,Overflow,请参见如下代码: bitSize := 64 maxVal := uint64(1)<<uint(bitSize) - 1 fmt.Println(maxVal) // 18446744073709551615 位大小:=64 maxVal:=uint64(1)由于整数溢出,您的第一个案例“有效” 由于使用的是uint(bitSize),因此表达式不再是常量,而是在运行时进行计算 将其分解,这将产生: uint64(1):那只是1 1由于整数溢出,您的第一个案例“有效” 由于使用

请参见如下代码:

bitSize := 64
maxVal := uint64(1)<<uint(bitSize) - 1
fmt.Println(maxVal) // 18446744073709551615
位大小:=64
maxVal:=uint64(1)由于整数溢出,您的第一个案例“有效”

由于使用的是
uint(bitSize)
,因此表达式不再是常量,而是在运行时进行计算

将其分解,这将产生:

  • uint64(1)
    :那只是
    1
  • 1由于整数溢出,您的第一个案例“有效”

    由于使用的是
    uint(bitSize)
    ,因此表达式不再是常量,而是在运行时进行计算

    将其分解,这将产生:

    • uint64(1)
      :那只是
      1

    • 1是“恐慌”还是“编译失败”?对不起,是“编译失败”,不是恐慌,谢谢。是“恐慌”还是“编译失败”?对不起,是“编译失败”,不是恐慌,谢谢。
      
      fmt.Println(uint64(1)<<uint(64)-1) // constant 18446744073709551616 overflows uint64
      
      fmt.Println(uint64(1<<64 - 1))