Почему в Pyside выдача целого числа > 0x7FFFFFFFF приводит к ошибке «OverflowError» после обработки сигнала?

Я пытаюсь использовать сигналы/слоты с большими целыми числами в диапазоне от 0 до 2^32-1. Я обнаружил кое-что немного странное: как только я испускаю границу > 7FFFFFFFF, я получаю исключения OverflowError, выдаваемые после запуска слота. Я мог бы ожидать такого переполнения, если бы я или QT явно использовали 32-битное целое число со знаком на другом языке, таком как C или C++ - поскольку мы все знаем, что 0x80000000 возвращается к -2 ^ 31 в нотации дополнения 2s. Однако в питоне это всего 2 ^ 32 без переноса. Мое предположение при написании кода заключалось в том, что это python и что встроенный int может вырасти очень большим (может быть, произвольно?) и что мне не нужно явно определять что-то как 32- или 64-битное или подписанное/беззнаковое. Все бы просто работало.

Код ниже демонстрирует то, что я вижу (Python 2.7.2 (64 бит), Pyside 1.1.0, Windows 7)

from PySide.QtCore import *

@Slot(int)
def say(i):
    print "Say %i" % i

class Communicate(QObject):
    speak = Signal(int)

someone = Communicate()
someone.speak.connect(say)
someone.speak.emit(0x7FFFFFFF) #works fine
someone.speak.emit(0x80000000) #OverflowError after slot "say" runs
say(0x80000000)                #works fine

Точный вывод:

Say 2147483647
Say -2147483648
OverflowError
Say 2147483648
  1. Почему Qt, похоже, обрабатывает сигналы/слоты целочисленного типа так, как если бы он имел дело с 32-битными целыми числами со знаком, а не со встроенными целыми числами Python?
  2. Если это ограничение Qt, что я могу сделать, чтобы пометить int как беззнаковое или убедиться, что QT может работать с целыми числами > 0x7FFFFFFFF?
5
задан Doug T. 26 May 2012 в 00:55
поделиться