按位操作和Go新手在这里:D我正在使用Go从传感器读取一些数据,我将其作为2个字节获取-假设
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 |
查看可能的重复项:
Golang:故意int溢出
Go编译器对常量表达式和其他表达式的评估是否有所不同
-
我已经尝试过用其他格式
fmt.Println(int16(uint16(0xFFFE))) 来尝试它,并引发溢出错误。 那为什么在您的示例中有效呢? - @Devlige因为常量值只能在类型可以表示确切值的情况下进行转换。 在我的示例中,我不是在转换常量,而是在允许溢出的变量(就像其他语言一样)进行转换。 有关详细说明,请检查:对于常量表达式和其他表达式,go编译器评估是否有所不同?
- 完善! 总之,Go确实不错。 它只需要更多的知识:)谢谢
- @kostix当我想发布链接时。 该链接包含有关常量的"更多知识"。
- 似乎这仅适用于vars,如果将其写为单行则失败:常量65534溢出int16