将UINT16施放到INT16的正确方法



位操作,在这里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溢出

确实可以进行编译器的评估在恒定表达和其他表达式

方面有所不同

相关内容

最新更新