2

在这里按位操作和 Go 新手: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)
}

它似乎有效,但是 A)我不完全确定为什么,并且 B)对于我想象的将 uint16 转换为 int16 的简单解决方案来说,它看起来有点难看。谁能帮我解释一下为什么这是唯一的方法?或者还有其他可能的方法吗?

4

1 回答 1

6

但是你想要的作品,“Go is nice”:

ui := uint16(0xFFFE)
fmt.Println(ui)
i := int16(ui)
fmt.Println(i)

输出(在Go Playground上试试):

65534
-2

int16(0xFFFE)不起作用,因为0xfffe它是一个无类型的整数常量,不能用 type 的值表示int16,这就是编译器抱怨的原因。但是您当然可以将任何uint16非常量值转换为int16.

查看可能的重复项:

Golang:故意int溢出

go 编译器对常量表达式和其他表达式的评估是否不同

于 2017-12-29T13:42:23.137 回答