将int转换为uint时没有恐慌?

时间:2017-01-29 06:21:37

标签: go

我对以下类型转换感到困惑。我希望两个uint转换都会出现恐慌。

a := -1
_ = uint(a) // why no panic?

_ = uint(-1) // panics: constant -1 overflows uint

为什么第2行没有恐慌?

https://play.golang.org/p/jcfDL8km2C

1 个答案:

答案 0 :(得分:3)

issue 6923中所述:

  

T(c)其中T是一种类型而c是一种常量,意味着将c视为具有类型T而非其中一种默认类型。
  如果在c中无法表示T,则会出现错误,但对于floatcomplex常量,只要值为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

这是转换非常量数值的具体规则:

  

在整数类型之间进行转换时,如果该值是有符号整数,则将其符号扩展为隐式无限精度;否则延长为零   然后将其截断以适合结果类型的大小。