猿问

具有无符号值的位移给出有符号结果

使用无符号uint32变量进行位移运算,为什么会int收到有符号结果?


func NewNM(log2Dim uint32) {

    SIZE := 1 << (3 * log2Dim) // Why: SIZE type == int

    // ...

}


Qyouu
浏览 117回答 1
1回答

斯蒂芬大帝

来自go 语言参考移位表达式中的右操作数必须是整数类型或者是可由 uint 类型的值表示的无类型常量。如果非常量移位表达式的左操作数是无类型常量,则首先将其隐式转换为仅将移位表达式替换为其左操作数时假定的类型。然后...移位运算符将左操作数移位由右操作数指定的移位计数,该移位计数必须为非负数。如果班次计数在运行时为负数,则会发生运行时恐慌。如果左操作数是有符号整数,则移位运算符实现算术移位,如果左操作数是无符号整数,则实现逻辑移位。所以1表达式1 << (3 * log2Dim)中的根据第一段转换为an&nbsp;int,然后移位是根据第二段算术移位。
随时随地看视频慕课网APP

相关分类

Go
我要回答