次のタイプ変換について混乱します。私はuint
の両方の変換がパニックになることを期待しています。intをintに変換するときにパニックが発生しませんか?
a := -1
_ = uint(a) // why no panic?
_ = uint(-1) // panics: constant -1 overflows uint
2行目でなぜパニックにならないのですか?
https://play.golang.org/p/jcfDL8km2C
次のタイプ変換について混乱します。私はuint
の両方の変換がパニックになることを期待しています。intをintに変換するときにパニックが発生しませんか?
a := -1
_ = uint(a) // why no panic?
_ = uint(-1) // panics: constant -1 overflows uint
2行目でなぜパニックにならないのですか?
https://play.golang.org/p/jcfDL8km2C
issue 6923で述べたように:
ここ
T(c)
T
タイプであり、c
タイプT
ではなく、デフォルトのタイプの1つを有するようc
を治療するための一定の手段です。
とcomplex
の定数の値があまりにも大きくない限り、T
に静かに丸めている点を除いて、c
をT
で表すことはできません。
: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」を参照してください。符号付き整数であり、暗黙の無限精度に符号拡張されています。それ以外の場合はゼロ拡張されます。
これは結果の型のサイズに収まるように切り捨てられます。
https://golang.org/ref/spec#Conversions –
ほとんどの場合、リテラルの値を知っているので、すぐに愚かなアイデアを伝えることができます。また、実行時のコストが高すぎるため、実行時に実行されません。 –