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))