1 << 64 - 1如何工作?

Par*_*ris 15 bit-shift go

http://tour.golang.org/#14上,他们展示了一个数字1移位64位的例子.这当然会导致溢出,但随后减去1并且一切都很好.一半表达式如何导致失败,而整个表达式整体工作正常?

思考:
我认为将无符号设置为大于允许数量的数字是导致爆炸的原因.看起来内存在表达式的右侧比在左侧更松散地分配?这是真的?

use*_*610 16

表达式的结果是(编译时)常量,因此在编译期间计算表达式.语言规范强制要求

始终精确计算常量表达式; 中间值和常量本身可能要求精度明显大于语言中任何预先声明的类型所支持的精度.以下是法律声明:

const Huge = 1 << 100         // Huge == 1267650600228229401496703205376  (untyped integer constant)
const Four int8 = Huge >> 98  // Four == 4                                (type int8)
Run Code Online (Sandbox Code Playgroud)

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


Nil*_*nck 5

这是因为 Go 编译器将常量表达式作为数字常量处理。与必须遵守范围、存储位和溢出等副作用的数据类型相反,数字常量永远不会失去精度。

当您将数字常量分配给变量时(该变量具有已知的类型,因此具有数字范围以及将数字存储为位的定义方式),数字常量只会被推导为具有有限精度和范围的数据类型。您还可以通过将它们用作包含非数字常量类型的方程的一部分来强制将它们推导为普通数据类型。

使困惑?我也是..

这是关于数据类型以及如何处理常量的较长文章:http://www.goinggo.net/2014/04/introduction-to-numeric-constants-in-go.html ?m=1