Estoy intentando utilizar señales/ranuras con números enteros grandes que van de 0 a 2^32-1. Descubrí algo un poco raro: una vez que emito el límite 7FFFFFFF, recibo excepciones OverflowError lanzadas después de se ejecuta la ranura. Podría esperar este tipo de desbordamiento si I o QT estuvieran usando explícitamente un entero de 32 bits con signo en otro idioma como C o C++, ya que todos sabemos que 0x80000000 vuelve a -2^31 en notación de complemento 2s. En Python, sin embargo, es solo 2^32 sin envolver. Mi suposición al escribir el código fue que esto es python y que el int interno puede crecer muy grande (¿tal vez arbitrariamente?) Y que no necesito definir explícitamente algo como 32 o 64 bits o firmado/sin firmar. Todo funcionaría.En Pyside, ¿por qué emitir un entero> 0x7FFFFFFF da como resultado "OverflowError" después de procesar la señal?
El código siguiente muestra lo que estoy viendo (Python 2.7.2 (64 bits), 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
La salida exacta es:
Say 2147483647 Say -2147483648 OverflowError Say 2147483648
- ¿Por qué Qt parece tratar las señales/ranuras de tipo entero como si se tratara de enteros de 32 bits con signo y no de intes incorporados en Python?
- Si esto es una restricción de Qt, ¿qué puedo hacer para marcar el int como unsigned o asegurarme de que QT pueda tratar con enteros> 0x7FFFFFFF?
"todos sabemos 0x80000000 envuelve a -1" - no creo que cambie nada, pero 0xfffffffff es -1 y 0x80000000 es el mayor entero negativo de 32 bits en complemento a 2s. –
@andrewcooke tienes razón, he resuelto la pregunta. –
Obviamente Qt hace suposiciones que no se ajustan a Python. –