为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
Qyouu 2022-06-13 17:16:48
使用无符号uint32变量进行位移运算,为什么会int收到有符号结果?func NewNM(log2Dim uint32) {    SIZE := 1 << (3 * log2Dim) // Why: SIZE type == int    // ...}
查看完整描述

1 回答

?
斯蒂芬大帝

TA贡献1827条经验 获得超8个赞

来自go 语言参考

移位表达式中的右操作数必须是整数类型或者是可由 uint 类型的值表示的无类型常量。如果非常量移位表达式的左操作数是无类型常量,则首先将其隐式转换为仅将移位表达式替换为其左操作数时假定的类型。

然后...

移位运算符将左操作数移位由右操作数指定的移位计数,该移位计数必须为非负数。如果班次计数在运行时为负数,则会发生运行时恐慌。如果左操作数是有符号整数,则移位运算符实现算术移位,如果左操作数是无符号整数,则实现逻辑移位。

所以1表达式1 << (3 * log2Dim)中的根据第一段转换为an int,然后移位是根据第二段算术移位。


查看完整回答
反对 回复 2022-06-13
  • 1 回答
  • 0 关注
  • 116 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信