在Go中将uint16转换为int16的正确方法

在Go中将uint16转换为int16的正确方法,go,bit-manipulation,uint16,Go,Bit Manipulation,Uint16,按位操作和Go新手:D我正在用Go从传感器读取一些数据,我得到的数据是2个字节,比如说0xFFFE。将其转换为uint16也很容易,因为在Go中,我们可以只执行uint16(0xFFFE),但我需要将其转换为整数,因为传感器返回的实际值范围为-32768到32767。现在我想“也许Go会这么好,如果我做了int16(0xFFFE)它就会理解我想要什么?”但没有。我最终使用了以下解决方案(我从web翻译了一些python代码): x:=0xFFFE 如果(x&(1但是你想要的是有效的,“Go’s

按位操作和Go新手:D我正在用Go从传感器读取一些数据,我得到的数据是2个字节,比如说
0xFFFE
。将其转换为uint16也很容易,因为在Go中,我们可以只执行
uint16(0xFFFE)
,但我需要将其转换为整数,因为传感器返回的实际值范围为-32768到32767。现在我想“也许Go会这么好,如果我做了
int16(0xFFFE)
它就会理解我想要什么?”但没有。我最终使用了以下解决方案(我从web翻译了一些python代码):

x:=0xFFFE
如果(x&(1但是你想要的是有效的,“Go’s nice”:

输出(在上尝试):

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

请参阅可能的副本:


我尝试过一种稍有不同的形式
fmt.Println(int16(uint16(0xFFFE))
它会引发溢出错误。那么为什么它在您的示例中会起作用?@Devlige因为常量值只能在类型能够表示精确值的情况下进行转换。在我的示例中,我不是转换常量,而是转换一个允许溢出的变量(就像其他语言一样)。要获得详细的解释,请勾选:完美!总之,围棋确实不错。它只需要多一点知识:)谢谢you@kostix就在我想发布链接的时候。该链接包含“更多知识”关于常量,这似乎只有在vars中才可能,如果write作为一个线性函数失败:常量65534溢出int16A次要的挑剔:Go没有类型转换;它有类型转换。
x := 0xFFFE

if (x & (1 << 15)) != 0 {
    x = x - (1<<16)
}
ui := uint16(0xFFFE)
fmt.Println(ui)
i := int16(ui)
fmt.Println(i)
65534
-2