今天给两道类似的题目,注意,有半数以上的人可能会做错!
package main
func main() {
var a int8 = -1
var b int8 = -128 / a
println(b)
}
package main
func main() {
const a int8 = -1
var b int8 = -128 / a
println(b)
}
题一:
因为 var b int8 = -128 / a 不是常量表达式,因此 untyped 常量 -128 隐式转换为 int8 类型(即和 a 的类型一致),所以 -128 / a 的结果是 int8 类型,值是 128,超出了 int8 的范围。因为结果不是常量,允许溢出,128 的二进制表示是 10000000,正好是 -128 的补码。所以,第一题的结果是 -128。
题二:
-128 和 -1 都是 const,直接在编译时求值,untyped 的 -128 隐式转 int8,结果为 128,仍然是一个 const。const 转换时不允许溢出,编译错误。 其实差别就是表达式的值,题一不是常量题二是,常量类型转换不允许溢出后 truncate。