按位移位 returns Python 中的意外值
Bitwise shift returns unexpected value in Python
我在C#中执行55 << 30
和Python3.C#returns-1073741824
,这是我想要的,但是Pythonreturns 59055800320
。有人可以解释为什么会发生这种情况,我可以做些什么来解决这个问题?
python 整数是任意大的......你可以强制它
import numpy
numpy.int32(55) << 30
Python 整数是无界的,所以 59055800320
是正确答案,但要模拟 C# 对整数和 2 补负数的 32 位限制,您可以计算:
>>> hex(55)
'0x37'
>>> hex(55 << 30) # 36-bit result, too large for 32-bit integers
'0xdc0000000'
>>> hex(55 << 30 & 0xffffffff) # mask off lower 32 bits.
'0xc0000000'
>>> ((55 << 30) & 0xffffffff) # but the sign (bit 31) is a one, so it should be negative
3221225472
32 位有符号整数中的第 31 位值为 -231,但无符号整数的值为 231,这意味着值是 232 太高了,所以:
>>> ((55 << 30) & 0xffffffff) - (1<<32)
-1073741824
这是一个函数:
def signed_32bit_shift_left(n,s):
tmp = (n << s) & 0xffffffff
return tmp - (1<<32) if tmp & 0x80000000 else tmp
正如其他人所说,Python int
比您预期的要大得多。观察这个(Python 3.7.4):
>>> import sys
>>> type(55)
<class 'int'>
>>> sys.getsizeof(int())
24
sys.getsizeof()
将 return 对象在内存中的大小(以字节为单位)。
我在C#中执行55 << 30
和Python3.C#returns-1073741824
,这是我想要的,但是Pythonreturns 59055800320
。有人可以解释为什么会发生这种情况,我可以做些什么来解决这个问题?
python 整数是任意大的......你可以强制它
import numpy
numpy.int32(55) << 30
Python 整数是无界的,所以 59055800320
是正确答案,但要模拟 C# 对整数和 2 补负数的 32 位限制,您可以计算:
>>> hex(55)
'0x37'
>>> hex(55 << 30) # 36-bit result, too large for 32-bit integers
'0xdc0000000'
>>> hex(55 << 30 & 0xffffffff) # mask off lower 32 bits.
'0xc0000000'
>>> ((55 << 30) & 0xffffffff) # but the sign (bit 31) is a one, so it should be negative
3221225472
32 位有符号整数中的第 31 位值为 -231,但无符号整数的值为 231,这意味着值是 232 太高了,所以:
>>> ((55 << 30) & 0xffffffff) - (1<<32)
-1073741824
这是一个函数:
def signed_32bit_shift_left(n,s):
tmp = (n << s) & 0xffffffff
return tmp - (1<<32) if tmp & 0x80000000 else tmp
正如其他人所说,Python int
比您预期的要大得多。观察这个(Python 3.7.4):
>>> import sys
>>> type(55)
<class 'int'>
>>> sys.getsizeof(int())
24
sys.getsizeof()
将 return 对象在内存中的大小(以字节为单位)。