Sto tentando di utilizzare segnali/slot con numeri interi grandi compresi tra 0 e 2^32-1. Ho scoperto qualcosa di strano: una volta emesso il limite> 7FFFFFFF, ottengo le eccezioni OverflowError generate dopo lo lo slot viene eseguito. Potrei aspettarmi questo tipo di overflow se io o QT usassimo esplicitamente un intero con segno a 32 bit in un'altra lingua come C o C++ - come tutti sappiamo 0x80000000 torna a -2^31 in notazione complemento a 2 secondi. In Python però, è solo 2^32 senza wrapping. Il mio presupposto quando scrivevo il codice era che si trattava di python e che il built-in int può diventare molto grande (forse arbitrariamente così?) E che non ho bisogno di definire esplicitamente qualcosa come 32 o 64 bit o firmato/non firmato. Funzionerebbe tutto solo.In Pyside, perché l'emettere un intero> 0x7FFFFFFF genera "OverflowError" dopo che il segnale è stato elaborato?
Il seguente codice illustra quello che sto vedendo (Python 2.7.2 (64 bit), 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
L'uscita esatta è:
Say 2147483647 Say -2147483648 OverflowError Say 2147483648
- Perché Qt sembra trattare i segnali/slot di tipo intero come se si trattasse di interi a 32 bit con segno e non di inti incorporati in python?
- Se questa è una limitazione di Qt, cosa posso fare per contrassegnare l'int come non firmato o accertarmi che QT possa gestire interi> 0x7FFFFFFF?
"tutti sappiamo 0x80000000 torna a -1" - non penso che cambi nulla, ma 0xfffffffff è -1 e 0x80000000 è il numero intero a 32 bit negativo maggiore nel complemento a 2. –
@erewcooke sei corretto, ho risolto la domanda. –
Ovviamente Qt formula assunzioni che non si adattano a Python. –