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

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.任何人都可以帮我一把,并澄清为什么这只是这样做的方法?或者还有其他可行的方法吗?

icz*_*cza 6

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

对于常量表达式和其他表达式,编译器的评估是否有所不同

  • @Devlige因为只有类型可以表示确切的值,才能转换常量值.在我的例子中,我不是转换常量而是转换变量,允许溢出(就像在任何其他语言中一样).有关详细解释,请检查:[编译器的评估对于常量表达式和其他表达式是否有所不同](/sf/ask/2761139671/表达和 - 另一expressio/39445372#39445372) (2认同)