Я использую python 2.7, numpy 1.6.1, 32-bit на окнах. Я пишу функцию, чтобы упаковать некоторые данные в 32-битные целые числа и генерировать исходные объявления C из постоянных значений. При этом я обнаружил странное поведение в типе uint8 numpy.Почему смещение numpy uint8 создает отрицательные значения?
Никто не удивляется, я уверен, чтобы увидеть это:
>>> n = 0x94 << 24
>>> n
2483027968L
>>> hex(n)
'0x94000000L'
Но сделать то же самое с Numpy uint8, и вы получите то, что меня удивило:
>>> n = np.uint8(0x94) << 24
>>> n
-1811939328
>>> hex(n)
'-0x6c000000'
One будет думать, что явно неподписанный тип будет еще реже возвращать отрицательное значение.
Обратите внимание, что значения со знаком-битном четкой работы, как и ожидалось:
>>> n = np.uint8(0x74) << 24
>>> n; hex(n)
1946157056
'0x74000000'
я случайно заметил, что NumPy, кажется, поощрения неподписанных типов для подписанных типов:
>>> n = np.uint8(0x74) << 24
>>> type(n)
<type 'numpy.int32'>
Это кажется ясная ошибка. Я не могу найти ссылку на такую известную ошибку, но ... не так ли?