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