this code is right,
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))
}
But when i add
fmt.Println(Big)
I meet an error:
tmp/sandbox042871394/main.go:16: constant 1267650600228229401496703205376 overflows int
i am confused for
const (
Big = 1 << 100
Small = Big >> 99
)
why there is no error for this two lines code.
Big and Small are untyped constants.
fmt.Println
accepts interface{}
. Constant is converted to its default type.
The default type is int.
Short answer : Big is untyped integer constant
Constant expressions are always evaluated exactly; intermediate values and the constants themselves may require precision significantly larger than supported by any predeclared type in the language. The following are legal declarations:
const Huge = 1 << 100 // Huge == 1267650600228229401496703205376 (untyped integer constant)
const Four int8 = Huge >> 98 // Four == 4 (type int8)
reference https://golang.org/ref/spec#Constant_expressions
Here in the constant you have not explicitly said it is an integer if said it would have failed
const (
Big int = 1 << 100
Small = Big >> 99
)
will show error
tmp/sandbox351128854/main.go:9: constant 1267650600228229401496703205376 overflows int