go指南数值常量问题

Ivosun · 2014-01-27 15:39:10 · 6316 次点击 · 大约8小时之前 开始浏览    置顶
这是一个创建于 2014-01-27 15:39:10 的主题,其中的信息可能已经有所发展或是发生改变。

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(needInt(Big))
}

Q1 :<< >> 是什么运算符?

Q2:最后一行命令会有报错 “prog.go:19: constant 1267650600228229401496703205376 overflows int”

Q3:文中提到“一个未指定类型的常量由上下文来决定其类型。”具体含义

小白 求帮助求鄙视


有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

6316 次点击  
加入收藏 微博
2 回复  |  直到 2018-06-20 15:03:19
jimmykuu
jimmykuu · #1 · 11年之前

A1:

`<<`和`>>`是移位操作,分别是左移和右移,`1 << 100`即二进制1往左移100位,就是1后面100个0,也即2的100次方。

A2,Q3:

Big的类型是float64,Big的值很大,因此Go会根据这个值的大小1267650600228229401496703205376来决定Big的类型,它的类型是float64类型,而不是int。int类型还和操作系统有关,64位是int64,32位是int32,不管是64位还是32位,这个大小都超过了int的最大值,因此Go判断其类型为float64。而`needInt`需要int参数,所以报错。
OctopusLian
OctopusLian · #2 · 7年之前

左移100,右移99,所以Small的值为2。感谢楼上的讲解!

添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传