2017-01-29 19 views
1

次のタイプ変換について混乱します。私はuintの両方の変換がパニックになることを期待しています。intをintに変換するときにパニックが発生しませんか?

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

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

2行目でなぜパニックにならないのですか?

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

+0

https://golang.org/ref/spec#Conversions –

+0

ほとんどの場合、リテラルの値を知っているので、すぐに愚かなアイデアを伝えることができます。また、実行時のコストが高すぎるため、実行時に実行されません。 –

答えて

3

issue 6923で述べたように:

T(c)Tタイプであり、cタイプTではなく、デフォルトのタイプの1つを有するようcを治療するための一定の手段です。
complexの定数の値があまりにも大きくない限り、Tに静かに丸めている点を除いて、cTで表すことはできません。

ここ

:uintに(暗黙的に)convertedすることはできませんので-1

const x uint = -1 
var x uint = -1 

これは動作しません。 aため

_ = uint(a) // why no panic? 

は、型なし一定ではなく、入力した変数(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 
} 

結果:値場合、整数型の間で変換する場合

:非定数の数値に変換するための特定の規則である4294967295

Playground及び「what's wrong with golang constant overflows uint64」を参照してください。符号付き整数であり、暗黙の無限精度に符号拡張されています。それ以外の場合はゼロ拡張されます。
これは結果の型のサイズに収まるように切り捨てられます。

+0

https://groups.google.com/forum/#!topic/golang-nuts/2L7NfqtZYls – VonC

+1

@mattesも参照してください。[go定数を読む必要があります](https://blog.golang.org /定数)は、とりわけ、さまざまな型の最大整数値に対して定数を定義することを扱います。 – kostix

関連する問題