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

Proper way for casting uint16 to int16 in Go

此处按位操作和 Go 新手 :D 我正在使用 Go 从传感器读取一些数据,我将其作为 2 个字节获取 - 比方说 0xFFFE。将它转换为 uint16 也很容易,因为在 Go 中我们可以只做 uint16(0xFFFE) 但我需要的是将它转换为整数,因为传感器 returns 实际上的值在 -32768 到 32767 之间。现在我想"Maybe Go will be this nice and if I do int16(0xFFFE) it will understand what I want?",但是没有。我最终使用了以下解决方案(我从网上翻译了一些 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.

查看可能的重复项: