golang中常量左移后的奇妙问题

packagemain
import(
"fmt"
)
const(
cimaxuint8=255
)
funcmain(){
variuint8
varimaxuint8=255
i=imax<<4
fmt.Printf("%d\n",i)
//i=cimax<<4//为什么这里的常量不能正常左移呢?
//fmt.Printf("%d\n",i)
fmt.Printf("%d\n",0xf0)
}
是不是常量不能作为左移操作法的操作数?
慕尼黑的夜晚无繁华
浏览 516回答 2
2回答

阿波罗的战车

以下是一些不够严谨的分析。参照文档进行研究,Go必然有这么几个特点:编译型语言,编译器的静态求值是自然的。必须使用强制类型转换。甚至于对一个uint16变量赋uint8的值都是不允许的。整数字面值不包含存储空间的大小,可以直接赋给各种uintX(必须不溢出)。

一只斗牛犬

>>>gobuilda.go#command-line-arguments./a.go:18:constant4080overflowsuint8这错误很明显了啊,溢出了。你那个变量的类型是uint8,能存储的最大值是255。为什么「变量」没有报溢出的错误呢?因为它是「变量」,编译器在编译时没能确定执行到那里的时候它一定会溢出(说不定你在什么地方改变了它的值所以不会溢出了)。编译器会保证「常量」不会变化(你不能以正常的方式对它赋值),所以编译的时候它能够把这些地方先计算了,于是它发现你在给一个uint8类型的变量赋值一个超过它的最大值的数。(大概是因为go太新了吧。像这种C程序,gcc带优化编译完之后只会剩下输出语句,计算都会提前算了。不过对于变量也不会有警告。)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript