在 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
.
查看可能的重复项:
此处按位操作和 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
.
查看可能的重复项: