今天给两道类似的题目,注意,有半数以上的人可能会做错!
题一:
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)
}
上面2个问题能否通过编译,能编译通过的话会输出什么内容
答: 题目一能通过编译 输出的是 -128 题目二不能通过编译 GO语言规范里面有这一句话
对于带符号整数值来说, + , - , * , / 和 « 运算可以合法地溢出,其产生的值是存在的并且可以被带符号整数表示法、其运算和操作数明确地定义 因此 -128/-1 = 128,int8的范围是 -128~127 这里的 128就越界了 128 的二进制表示是 10000000 正好是 -128 的补码。所以,第一题的结果是 -128。
为什么第二题会编译失败呢?
对于 var b int8 = -128 / a,因为 a 是 int8 类型常量,所以 -128 / a 是常量表达式。编译器计算,结果必然也是常量。 因为 a 的类型是 int8,因此 -128 也会隐式转为 int8 类型,128 这个结果超过了 int8 的范围,但常量不允许溢出,因此编译报错。