2012-11-01 35 views
23

Kích thước char, int, long double ... có thể thay đổi từ trình biên dịch này sang trình biên dịch khác. Nhưng tôi có đảm bảo theo tiêu chuẩn C++ 11 hoặc C11 rằng kích thước của bất kỳ loại tích phân cơ bản đã ký và chưa ký nào là giống nhau không?Tôi có đảm bảo rằng sizeof (loại) == sizeof (loại không dấu) không?

+0

Tôi nên hy vọng như vậy trừ khi có bằng cách nào đó một loại mà bất bình đẳng có ý nghĩa, trong trường hợp đó, tôi rất vui khi nghe nó. – chris

+1

Cũng như một sang một bên, sizeof char luôn luôn là 1. char có thể có kích thước bất thường, như 16 bit, nhưng sau đó sizeof char vẫn sẽ là 1 và sizeof một loại 32 bit sẽ là 2. –

Trả lời

40

C++ 11 Tiêu chuẩn nói về các loại nguyên:

(§3.9.1/3) Đối với mỗi tiêu chuẩn ký kiểu nguyên, tồn tại một tiêu chuẩn tương ứng (nhưng khác nhau) kiểu dữ liệu integer unsigned : "Unsigned char", "unsigned short int", "unsigned int", "unsigned long int" và "unsigned long long int", mỗi trong số đó chiếm cùng một lượng lưu trữ và có cùng yêu cầu căn chỉnh (3.11) là loại số nguyên đã ký tương ứng; có nghĩa là, mỗi loại số nguyên đã ký có cùng một đối tượng đối tượng làm loại số nguyên không dấu tương ứng của nó. Tương tự như vậy, đối với mỗi loại số nguyên được ký mở rộng tồn tại một loại số nguyên không dấu mở rộng tương ứng với cùng số lượng yêu cầu lưu trữ và căn chỉnh. [...]

Vì vậy, câu trả lời là có.

Đối với C11, có một tuyên bố tương ứng ở đây (đây là từ N1570):

(§6.2.5/6) Đối với mỗi loại nguyên ký, có một tương ứng (nhưng khác nhau) unsigned kiểu số nguyên (được chỉ định với từ khóa unsigned) có sử dụng cùng một lượng lưu trữ (bao gồm thông tin dấu) và có các yêu cầu liên kết cùng một [...]

-1

có, có là một đảm bảo đầy đủ mà sizeof (loại đã ký) bằng sizeof (loại chưa ký) vì không được ký chỉ lấy không gian của số âm của loại đã ký để tăng phạm vi của nó.

+1

Không có gì trong tiêu chuẩn bắt buộc rằng 'UINT_MAX > INT_MAX'; máy đăng ký độ lớn có thể làm cho chúng bằng nhau. – supercat

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