我对以下类型转换感到困惑。我希望两个uint
转换都会出现恐慌。
a := -1
_ = uint(a) // why no panic?
_ = uint(-1) // panics: constant -1 overflows uint
为什么第2行没有恐慌?
答案 0 :(得分:3)
如issue 6923中所述:
T(c)
其中T
是一种类型而c
是一种常量,意味着将c
视为具有类型T
而非其中一种默认类型。
如果在c
中无法表示T
,则会出现错误,但对于float
和complex
常量,只要值为T
,我们就会悄悄地舍入const x uint = -1 var x uint = -1
不是太大。
下面:
_ = uint(a) // why no panic?
这不起作用,因为-1不能(隐含地) converted 到uint。
a
因为int
不是无类型常量,而是类型变量(package main
import "fmt"
func main() {
a := -1
_ = uint(a) // why no panic?
var b uint
b = uint(a)
fmt.Println(b)
// _ = uint(-1) // panics: main.go:7: constant -1 overflows uint
}
)。请参阅Playground和“what's wrong with golang constant overflows uint64”:
4294967295
结果:&val
这是转换非常量数值的具体规则:
在整数类型之间进行转换时,如果该值是有符号整数,则将其符号扩展为隐式无限精度;否则延长为零 然后将其截断以适合结果类型的大小。