Python中负数与0xFFFFFFFF按位与运算结果和预期不同的原因是什么
Python 负数与
0xFFFFFFFF按位与结果异常的原因 首先给出问题中的代码示例:
5 & 0xFFFFFFFF # 5 -5 & 0xFFFFFFFF # 4294967291
核心原因
Python 的整数采用任意精度补码表示,没有固定的位数限制,和C/Java等语言默认的32位/64位固定长度整数规则完全不同。
- 正数的二进制补码高位统一补0,因此5和32位全1的
0xFFFFFFFF做按位与时,高于32位的0和1做与运算结果为0,低32位的原值被完整保留,最终结果就是5,符合预期。 - 负数的二进制补码在Python中是高位无限补1,-5的补码低32位为
11111111 11111111 11111111 11111011,更高位全部为1。和0xFFFFFFFF运算时,高于32位的1和0做与运算结果为0,低32位的补码被完整保留,最终得到的是低32位补码对应的无符号正整数值4294967291。
你预期的“与全1运算保留原值”是建立在固定32位有符号整数的预设下的,此时低32位的补码会被识别为负数。但Python默认将整数按无边界的正整数解析,因此截断得到的32位补码会被当成大正数输出,不是运算逻辑错误,是整数表示规则的差异。
如果需要得到32位有符号整数的结果,可以手动做符号位转换:
res = -5 & 0xFFFFFFFF # 判断最高位是否为1,是则减去2^32转成有符号负数 res = res - 0x100000000 if res >> 31 else res print(res) # 输出-5
内容的提问来源于stack exchange,提问作者fatpanda2049
相关产品推荐
相关产品推荐

