【发布时间】:2019-07-26 16:02:57
【问题描述】:
我无法在 golang 中理解 1<<s 如果 var s uint = 33 返回 0。
但是1<<33 返回8589934592。
移位运算符转换如何以 0 的值结束。
我正在阅读语言规范并停留在本节: https://golang.org/ref/spec#Operators
特别是文档中的这一段:
"移位表达式的右操作数必须是无符号整数 type 或者是一个无类型的常量,可以用 uint 类型的值表示。 如果非常量移位表达式的左操作数是无类型的 常量,它首先被隐式转换为它假定的类型 如果移位表达式被其左操作数单独替换。"
来自官方 Golang 文档的一些示例:
var s uint = 33
var i = 1<<s // 1 has type int
var j int32 = 1<<s // 1 has type int32; j == 0
var k = uint64(1<<s) // 1 has type uint64; k == 1<<33
更新:
另一个非常相关的问题,举个例子:
package main
import (
"fmt"
)
func main() {
v := int16(4336)
fmt.Println(int8(v))
}
这个程序返回-16
在将int16转换为int8时,数字4336如何变成-16
【问题讨论】:
-
我在示例中更正了它
-
在这种情况下,答案是“因为符号位”。我目前无法引用规范,但显然这种转换是通过丢弃较高字节并将其余字节解释为带符号的 8 位 int 来完成的。有符号整数有一个叫做符号位的东西。如果该位为 1,则为负数。
-
非常有用的信息。它可以帮助我得到它。所以二进制的4336是1000011110000,16是10000。-16是110000?符号保留 2 位,所以 int8 的左边是 6 位,它导致将数字 1000011110000 截断为 10000(即 16)?
标签: go type-conversion operator-keyword