按位操作和Go newbie在这里:D我正在使用Go从传感器读取一些数据,我将其作为2个字节 - 让我们说0xFFFE
。很容易把它投到uint16,因为在Go我们可以做uint16(0xFFFE)
但我需要的是将它转换为整数,因为传感器实际返回范围从-32768到32767.现在我想“也许会去这很好,如果我做int16(0xFFFE)
它会理解我想要的东西吗?“但是没有。我最终使用了以下解决方案(我从网上翻译了一些python代码):
x := 0xFFFE
if (x & (1 << 15)) != 0 {
x = x - (1<<16)
}
它似乎工作,但A)我不完全确定为什么,和B)它看起来有点难看,我想象应该是一个简单的解决方案,将uint16转换为int16。任何人都可以帮我一把,并澄清为什么这只是这样做的方法?或者还有其他可行的方法吗?
但你想要的是什么,“Go is nice”:
ui := uint16(0xFFFE)
fmt.Println(ui)
i := int16(ui)
fmt.Println(i)
输出(在Go Playground上试试):
65534
-2
int16(0xFFFE)
不起作用,因为0xfffe
是一个无类型的整数常量,不能用int16
类型的值表示,这就是编译器抱怨的原因。但你肯定可以将任何uint16
非常数值转换为int16
。
看到可能的重复:
Golang: on-purpose int overflow
Does go compiler's evaluation differ for constant expression and other expression