位操作,在这里go newbie:D我正在读取传感器的一些数据,然后我将其作为2个字节 - 例如 0xFFFE
。很容易将其施加到UINT16,因为在Go中我们可以做uint16(0xFFFE)
,但是我需要将其转换为整数,因为传感器实际上返回了-32768到32767的范围内。现在我以为"也许"去这样,如果我做int16(0xFFFE)
,它将理解我想要什么?" ,但不。我最终使用以下解决方案(我从Web翻译了一些Python代码):
x := 0xFFFE
if (x & (1 << 15)) != 0 {
x = x - (1<<16)
}
它似乎有效,但是a)我不完全确定为什么,b)b)对于我想象的,它应该是将UINT16投射到INT16的琐碎解决方案。谁能给我一只手并澄清为什么这是这样做的唯一方法?还是还有其他可能的方法?
但是您想要的工作," GO是不错的":
ui := uint16(0xFFFE)
fmt.Println(ui)
i := int16(ui)
fmt.Println(i)
输出(在Go操场上尝试):
65534
-2
int16(0xFFFE)
不起作用,因为 0xfffe
是一个未型整数常数,无法用类型int16
的值表示,这就是编译器抱怨的原因。但是您当然可以将任何uint16
的非稳定值转换为int16
。
请参阅可能的重复:
golang:实时int溢出
确实可以进行编译器的评估在恒定表达和其他表达式