在Go中将uint16转换为int16的正确方法

时间:2017-12-29 13:37:28

标签: go bit-manipulation uint16

按位操作和Go newbie here:D我正在使用Go从传感器读取一些数据,我将其作为2个字节 - 让我们说0xFFFE。很容易把它转换为uint16,因为在Go中我们可以做uint16(0xFFFE)但我需要的是将它转换为整数,因为传感器实际上返回范围从-32768到32767的值。现在我想< em>&#34;也许Go会很好,如果我做int16(0xFFFE)它会理解我想要的东西吗?&#34; ,但没有。我最终使用了以下解决方案(我从网上翻译了一些python代码):

x := 0xFFFE

if (x & (1 << 15)) != 0 {
    x = x - (1<<16)
}

它似乎有效,但是A)我不完全确定为什么,而且B)看起来有点难看,我想象的应该是将uint16转换为int16的一个简单的解决方案。任何人都可以帮我一把,并澄清为什么这只是这样做的方法?或者还有其他可能的方式吗?

1 个答案:

答案 0 :(得分:6)

但你想要的是什么,“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