Я пытаюсь использовать сигналы/слоты с большими целыми числами в диапазоне от 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