按位操作和Go新手在这里:D我正在使用Go从传感器读取一些数据,我将其作为2个字节获取-假设0xFFFE。 也很容易将其强制转换为uint16,因为在Go中我们可以执行uint16(0xFFFE),但是我需要将其转换为整数,因为传感器实际上返回的值介于-32768到32767之间。现在我想"也许是Go 会很好,如果我执行int16(0xFFFE),它会明白我想要的吗?",但没有。 我最终使用了以下解决方案(我从网络上翻译了一些python代码):

1
2
3
4
5
x := 0xFFFE

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

它似乎可行,但是A)我不确定为什么,B)我认为应该是将uint16转换为int16的简单解决方案,这看起来有点难看。 谁能帮我一下,弄清楚为什么这是唯一的方法? 还是还有其他可能的方法?

  • 一个小问题:Go没有类型转换; 而是具有类型转换。

但是您想要的是," Go很好":

1
2
3
4
ui := uint16(0xFFFE)
fmt.Println(ui)
i := int16(ui)
fmt.Println(i)

输出(在Go Playground上尝试):

1
2
65534
-2

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

查看可能的重复项:

Golang:故意int溢出

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

  • 我已经尝试过用其他格式fmt.Println(int16(uint16(0xFFFE)))来尝试它,并引发溢出错误。 那为什么在您的示例中有效呢?
  • @Devlige因为常量值只能在类型可以表示确切值的情况下进行转换。 在我的示例中,我不是在转换常量,而是在允许溢出的变量(就像其他语言一样)进行转换。 有关详细说明,请检查:对于常量表达式和其他表达式,go编译器评估是否有所不同?
  • 完善! 总之,Go确实不错。 它只需要更多的知识:)谢谢
  • @kostix当我想发布链接时。 该链接包含有关常量的"更多知识"。
  • 似乎这仅适用于vars,如果将其写为单行则失败:常量65534溢出int16