Tôi đang cố sử dụng tín hiệu/khe với số nguyên lớn từ 0 - 2^32-1. Tôi đã phát hiện ra điều gì đó hơi kỳ lạ - một khi tôi phát ra> ranh giới 7FFFFFFF, tôi nhận được ngoại lệ OverflowError được ném sau khi khe được chạy. Tôi có thể mong đợi loại tràn này nếu tôi hoặc QT rõ ràng sử dụng một số nguyên 32 bit đã ký bằng một ngôn ngữ khác như C hoặc C++ - vì chúng ta đều biết 0x80000000 kết thúc tốt đẹp trở lại -2^31 trong ký hiệu bổ sung 2 giây. Trong python, chỉ có 2^32 mà không cần gói. Giả định của tôi khi viết mã mặc dù là đây là python và int tích hợp có thể phát triển rất lớn (có thể là arbitrarilly như vậy?) Và tôi không rõ ràng cần xác định thứ gì đó là 32 hoặc 64 bit hoặc đã ký/unsigned. Nó sẽ chỉ hoạt động.Trong Pyside, tại sao phát ra một kết quả số nguyên> 0x7FFFFFFF trong "OverflowError" sau khi tín hiệu được xử lý?
Đoạn code dưới đây cho thấy những gì tôi nhìn thấy (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
Sản lượng chính xác là:
Say 2147483647 Say -2147483648 OverflowError Say 2147483648
- Tại sao Qt dường như xử lý các tín hiệu/khe của kiểu số nguyên như thể giao dịch với các số nguyên 32 bit đã ký và không phải là mã int tích hợp python?
- Nếu đây là hạn chế của Qt, tôi có thể làm gì để đánh dấu int là chưa ký hoặc đảm bảo QT có thể xử lý các số nguyên> 0x7FFFFFFF?
"chúng ta đều biết 0x80000000 kết thúc tốt đẹp trở lại -1" - tôi không nghĩ rằng nó thay đổi bất cứ điều gì, nhưng 0xfffffffff là -1 và 0x80000000 là số nguyên âm 32 bit lớn nhất trong phần bổ sung 2 giây. –
@andrewcooke bạn đúng, tôi đã sửa câu hỏi. –
Rõ ràng Qt đưa ra các giả định không phù hợp với Python. –