2010-06-21 23 views
5

Tôi nhớ đọc ở đâu đó rằng Qt đảm bảo kích thước của một số loại dữ liệu trên nền tảng được hỗ trợ. Có phải là int sẽ là ít nhất 32 bit ở mọi nơi và qint32 sẽ là chính xác 32 bit ở khắp mọi nơi? Hay cái gì khác?Có đảm bảo là 32 bit trên mỗi nền tảng được hỗ trợ bởi Qt hay chỉ qint32?

C++ đảm bảo rằng int sẽ có ít nhất 16 bit và một số cấu trúc Qt như QRectQPoint sử dụng int nội bộ. Tôi đang phát triển một ứng dụng trong đó 32 bit là cần thiết với các loại đó và tôi không muốn phải sao chép chức năng của chúng để tôi có thể sử dụng loại lớn hơn.

Trả lời

6

Kích thước của một loại số nguyên là tùy thuộc vào trình biên dịch. Tôi không nghĩ rằng có một đảm bảo rằng đồng bằng int sẽ có kích thước chính xác. Nhưng bạn có thể chắc chắn rằng bạn biết điều đó không phải những gì bạn muốn bằng cách thêm dòng này vào đầu của main() của bạn:

if(sizeof(int) != 4) { 
    throw std::runtime_error("int is not 32-bit"); 
} 
+0

Ok, nhưng, 'QtGlobal' định nghĩa một số typedef. Ví dụ, tài liệu cho qint32 nói "Typedef cho int đã ký. Kiểu này được đảm bảo là 32 bit trên tất cả các nền tảng được hỗ trợ bởi Qt." Vì vậy, điều này có nghĩa rằng 'int' cũng phải được đảm bảo là 32 bit trên tất cả các nền tảng được hỗ trợ? –

+0

Tôi sẽ không lấy được kết luận đó. Tài liệu đảm bảo rằng qint32 sẽ có kích thước 32 bit trên tất cả các nền tảng được hỗ trợ, chứ không phải theo cách khác. Nếu họ phải hỗ trợ nền tảng trong tương lai mà int không phải là 32 bit, họ sẽ thay đổi typedef cho nền tảng đó để phản ánh điều đó. Khi được triển khai ngay bây giờ, bạn có thể giả định tất cả các nền tảng được hỗ trợ bởi Qt có int 32 bit. Nhưng giả định là một điều RẤT EVIL. –

+1

Mục đích của qint32 và bạn bè là cung cấp loại có chữ ký và kích thước được đảm bảo. Nếu các loại tiêu chuẩn sẽ cung cấp điều đó, người ta sẽ không cần những typedefs Qt;) Tôi đoán tài liệu Qt là mơ hồ được diễn tả ở đây. –

0

Trong khi, theo như tôi biết, đó là về mặt kỹ thuật có thể là int không phải là 32bits, tôi đã không bao giờ nhìn thấy một nền tảng mà nó không phải là. Hãy tưởng tượng- char, 8 bit, ngắn, 16bits, int, .. 24bits? Nó chỉ đơn giản là không phù hợp với hệ thống phân cấp cho int là không 32bits.

Ngoài ra, bạn có thể sử dụng UINT_MAX để xác nhận kích thước của int trên trình biên dịch đã cho.

+0

Có tấn vi điều khiển trong đó int là 16 bit. – Falmarri

+0

Kích thước (thu được bằng cách sử dụng toán tử 'sizeof') và ** số bit ** tối thiểu (để giá trị của' UINT_MAX' có thể được biểu diễn) là hai thứ khác nhau. Xem http://stackoverflow.com/q/271076/95735 –

Các vấn đề liên quan