>>> result = 0
>>> x = -2
>>>
>>> for i in range(32):
... c = 1 << i
... if c & x: result |= c
...
>>> print(result)
4294967294
如您所见,预期结果应为-2
,但程序会打印4294967294
,这是负数的二进制补码表示。
如何解决?在python中有signed integer
吗?
非常感谢!
答案 0 :(得分:3)
Python(甚至是Python 2)不强制执行整数子类型。你可以循环到48(而不是)32,Python会自动将数字转换为long,你会得到281474976710654L
。如果你在Python 2.x上打印repr(result)
会更明确,因为你会4294967294L
显示转换为long
你知道你想要的是一个带符号的32位整数,但Python不知道它。你所能做的只是一个明确的转换:
if result > 0x7fffffff: result = int(result - 0x100000000)
(int
转换强制在Python 2.x下从long转换为int
答案 1 :(得分:0)
我只看到3种可能性
结果变量超过32位
结果变量是unsigned int而不是signed
结果变量是任意大小(大整数)
sx=x; if (x<0) x=-x;
...在循环之前if (sx<0) result=-result;
...循环后