我正在尝试使用具有 0 - 2^32-1 范围内的大整数的信号/插槽。我发现了一些奇怪的东西——一旦我发出 > 7FFFFFFF 边界,我会在插槽运行后抛出 OverflowError 异常。如果我或 QT 在 C 或 C++ 等另一种语言中明确使用带符号的 32 位整数,我可能会预料到这种溢出——众所周知,0x80000000 在 2s 补码表示法中回绕到 -2^31。但是在 python 中,它只有 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
确切的输出是:
说 2147483647 说-2147483648 溢出错误 说2147483648
- 为什么 Qt 似乎将整数类型的信号/插槽视为处理带符号的 32 位整数而不是 python 内置整数?
- 如果这是 Qt 的限制,我该怎么做才能将 int 标记为无符号或确保 QT 可以处理大于 0x7FFFFFFF 的整数?