Я выполняю 55 << 30
в C# и Python 3. C# возвращает -1073741824
, чего я и хочу, а Python возвращает 59055800320
. Может кто-нибудь объяснить, почему именно это происходит, и что я могу сделать, чтобы это исправить?
python целые произвольно большие... вы можете заставить его вроде
import numpy
numpy.int32(55) << 30
Целые числа Python не ограничены, поэтому 59055800320
— правильный ответ, но для имитации 32-битного ограничения C# на целые числа и отрицательные числа с дополнением до 2 можно выполнить математику:
>>> 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
Бит 31 в 32-битном целом числе со знаком имеет значение -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() вернет размер объекта в памяти в байтах.