在命令行和游乐场中进行整数溢出设置

zla*_*ski 5 go

这个程序在我的机器上运行正常(go1.2.1 linux/amd64):

package main

import "fmt"

const bigint = 1<<62

func main() {
    fmt.Println(bigint)
}
Run Code Online (Sandbox Code Playgroud)

但是在go操场上,它会出现溢出错误 - http://play.golang.org/p/lAUwLwOIVR

似乎我的构建配置为64位用于整数常量,操场配置为32位.

但是规范说实现必须为常量提供至少256位的精度?

另请参阅我的其他问题中的代码- 扫描仪标准包具有代码:

const GoWhitespace = 1<<'\t' | 1<<'\n' | 1<<'\r' | 1<<' '
Run Code Online (Sandbox Code Playgroud)

由于空间为32,因此根本不适用于32位游乐场.

怎么会这样?

nem*_*emo 4

一般常数

常量本身不受精度限制,但在代码中使用时,它们会转换为合适的类型。从规格来看

常量可以通过常量声明或转换显式地指定类型,或者在变量声明或赋值中使用或作为表达式中的操作数时隐式地指定类型。如果常量值不能表示为相应类型的值,则这是一个错误。例如,3.0 可以指定为任何整数或任何浮点类型,而 2147483648.0(等于 1<<31)可以指定为 float32、float64 或 uint32 类型,但不能指定为 int32 或 string。

所以如果你有

const a = 1 << 33
fmt.Println(a)
Run Code Online (Sandbox Code Playgroud)

您将收到溢出错误,因为整数常量的默认类型int无法1 << 3332 位环境中保存该值。如果您将常量转换为int64所有平台上的一切都很好:

const a = 1 << 33
fmt.Println(int64(a))
Run Code Online (Sandbox Code Playgroud)

扫描器

该常数GoWhitespace不直接在扫描仪中使用。类型中使用的Whitespace属性Scanner是类型uint64并被GoWhitespace分配给它

s.Whitespace = GoWhitespace
Run Code Online (Sandbox Code Playgroud)

这意味着您处理一个uint64值并且1 << ' '(又名。1 << 32)是完全有效的。

示例(正在播放):

const w = 1<<'\t' | 1<<'\n' | 1<<'\r' | 1<<' '

c := ' '

// fmt.Println(w & (1 << uint(c))) // fails with overflow error
fmt.Println(uint64(w) & (1 << uint(c))) // works as expected
Run Code Online (Sandbox Code Playgroud)