2016-12-27 7 views
0

このコードは、右であるgolangのbig intはどのように表現されていますか?

package main 

import "fmt" 

const (
    Big = 1 << 100 
    Small = Big >> 99 
) 

func needInt(x int) int { return x*10 + 1 } 
func needFloat(x float64) float64 { 
    return x * 0.1 
} 

func main() { 
    fmt.Println(needInt(Small)) 
    fmt.Println(needFloat(Small)) 
    fmt.Println(needFloat(Big)) 
} 

しかし、私は

fmt.Println(Big) 

を追加したとき、私はエラーを満たし:

tmp/sandbox042871394/main.go:16: constant 1267650600228229401496703205376 overflows int 

私は

const (
     Big = 1 << 100 
     Small = Big >> 99 
    ) 

なぜトンのために混乱していますここではこの2行のコードのエラーはありません。

+1

"数値定数は、任意の精度の正確な値を表します。オーバーフロー。" - https://golang.org/ref/spec#Constants – Nadh

答えて

0

BigとSmallは型なしの定数です。

fmt.Printlninterface{}を受け入れます。 Constantはデフォルトの型に変換されます。

デフォルトのタイプはintです。

1

短い答え:ビッグが一定

定数式は、常に正確に評価され型なし整数です。中間値と定数そのものは、その言語の事前宣言された型でサポートされている精度よりもかなり高い精度を要求することがあります。あなたが明示的にエラー

が表示されます

const (
    Big int = 1 << 100 
    Small  = Big >> 99 
) 

を失敗したと述べた場合、それは整数であると述べていない定数でここ

const Huge = 1 << 100   // Huge == 1267650600228229401496703205376 (untyped integer constant) 
const Four int8 = Huge >> 98 // Four == 4        (type int8) 

参照https://golang.org/ref/spec#Constant_expressions

:以下の法的宣言されています

tmp/sandbox351128854/main.go:9: constant 1267650600228229401496703205376 overflows int 
+0

@blackmamba plese質問に答えた場合は、完了とマークしてください –

関連する問題