负值在python中打印为大数字



im从modbusTCP服务器提取数据,但当我收到负值时,它显示为一个大数字。

self.export = self.c.read_holding_registers(37113, 2)[1]

我知道这与它的签名或未签名有关,但我真的很难解决它

print("export:      " + "{:02f}W".format(self.inverter.export))
print("exportBytes: " + "{:16b}W".format(self.inverter.export))
print("export:      " + "{:02f}W".format(self.inverter.export))
print("export 1:    " + "{:16b}W".format(1))
print("export-1:    " + "{:16b}W".format(-1))

打印

export:      59142.000000kW
exportBytes: 1110011100000110kW
export:      59142.000000kW
export 1:                   1kW
export-1:                  -1kW

有什么猜测吗?

接收到的字节被隐式转换为无符号整数。

要转换为带符号的int,我们

  1. 使用Int.to_bytes((获取字节和
  2. 使用int.from_bytes((获取签名int
varBytes = theInteger.to_bytes(2, 'big')                               # getting raw bytes
signedInt = int.from_bytes(varBytes , byteorder='big', signed = True)  # getting signet int vale

作为无符号复制到int。";int";接收到的由python隐式转换为int。

Mads的解决方案我认为会奏效,但这可能更能说明正在发生的事情:

def int16_decode(uint16_val):
if uint16_val > 0x8000:
uint16_val -= 0x10000
return uint16_val

这就是有符号int在内存中的存储方式。int16与uint16类似,不同之处在于保留最高有效位作为符号位。所以,若你们读一个负的int16作为uint16,它将非常大,因为16的最高有效位是1。

相关内容

  • 没有找到相关文章

最新更新