首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在python中负值打印为大数

在python中负值打印为大数
EN

Stack Overflow用户
提问于 2022-10-16 13:33:21
回答 2查看 42关注 0票数 -1

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

代码语言:javascript
运行
复制
self.export = self.c.read_holding_registers(37113, 2)[1]

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

代码语言:javascript
运行
复制
    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))

印出

代码语言:javascript
运行
复制
export:      59142.000000kW
exportBytes: 1110011100000110kW
export:      59142.000000kW
export 1:                   1kW
export-1:                  -1kW

有什么猜测吗?

EN

回答 2

Stack Overflow用户

发布于 2022-10-16 20:13:51

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

要转换为签名的int,我们将

  1. 使用Int.to_bytes()获取字节,
  2. 使用int.from_bytes()获取印章.

代码语言:javascript
运行
复制
varBytes = theInteger.to_bytes(2, 'big')                               # getting raw bytes
signedInt = int.from_bytes(varBytes , byteorder='big', signed = True)  # getting signet int vale

复制到作为unsigned.The的int的" int“是由python隐式转换到int的。

票数 0
EN

Stack Overflow用户

发布于 2022-10-25 19:04:33

我认为麦德斯的解决方案是可行的,但这也许更能说明目前的情况:

代码语言:javascript
运行
复制
def int16_decode(uint16_val):
    if uint16_val > 0x8000:
        uint16_val -= 0x10000
    return uint16_val

这就是如何将签名的in存储在内存中。int16类似于uint16,但最重要的位被保留为符号位。所以,如果你把负int16读成一个uint16,它会非常大,因为最重要的16位是1。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74087534

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档