Моя проблема в том что
np.array([2**31], dtype=np.uint32) >> 32
не возвращает 0
, но вместо этого возвращает array([2147483648], dtype=uint32)
. То же самое верно для
np.right_shift(np.array([2**31], dtype=np.uint32), 32)
(поэтому я считаю, что это просто, как >>
реализовано).
Интересно, что все эти альтернативы, кажется, работают как ожидалось, возвращая некое значение 0
:
print(
2**31 >> 32,
np.uint32(2**31) >> 32,
np.array(2**31, dtype=np.uint32) >> 32,
np.right_shift(2**31, 32),
np.right_shift([2**31], 32),
np.right_shift(np.uint32(2**31), 32),
np.right_shift(np.array(2**31, dtype=np.uint32), 32),
)
В частности, что отличается между массивами Numpy, представляющими 2147483648
и [2147483648]
?
Я видел эту проблему в JavaScript (почему << 32 не приводит к 0 в javascript?) И C++ (Странное поведение оператора сдвига вправо (1 >> 32), Почему 'int >> 32' не всегда ноль?), но еще не в Python/Numpy. На самом деле, ни документы Python, ни Numpy, похоже, не документируют это поведение: