首页 > 解决方案 > 当第一个字节为零时,添加位会导致错误的数字

问题描述

我将 8 位整数组合成 32 位整数。当第一个字节为 0 时,python 出于某种原因将其解释为负数。

a = 0
b = -35
c = 64
d = 0
res = (a << 24) | (b << 16) | c << 8 | d   # res = -2277376 instead of 14499840

我需要 res 是 14499840 而不是 -2277376。有什么办法可以强制 python 不要忽略前 8 位?

标签: pythonbit-manipulationbytebit

解决方案


这不是因为a为零,而是因为b 是负数

>>> res = (a << 24) | (b << 16) | c << 8 | d
>>> res
-2277376
>>> b << 16
-2293760

因此,如果字节可能是负数,您需要首先通过使用 0xFF 屏蔽使它们为正数:

res = ((a & 0xFF) << 24) | ((b & 0xFF) << 16) | ((c & 0xFF) << 8) | (d & 0xFF)

或者更好地将输入读取为无符号字节而不是有符号


推荐阅读