2013-05-17 29 views
7

Do C và C++ đảm bảo rằng tương đương chưa ký của một loại có cùng kích thước?Từ khóa không dấu có ảnh hưởng đến kết quả của sizeof không?

Ví dụ:

size_t size = sizeof(unsigned int); 

unsigned hoàn toàn tranh luận ở đây?

+3

Trong khi dự phòng, tôi nghĩ bạn nên sử dụng 'sizeof (unsigned int)' nếu đó là khoảng trống cho 'unsigned int' để tránh nhầm lẫn. – zch

+2

Về mặt Tâm lý - Bạn muốn kích thước của X (bất kỳ X là gì) - Vì vậy, chỉ cần rõ ràng.Sau đó lập trình bạn sẽ luôn luôn đúng bất cứ điều gì X là - (unsigned int, class Cabbage ...) –

+0

Tôi sẽ ngạc nhiên nếu sizeof (int) không bao giờ bằng sizeof (unsigned). Tôi khuyên bạn nên tin tưởng nhưng xác minh. – matthudson

Trả lời

14

Cả hai ngôn ngữ đều đảm bảo rằng các biến thể đã ký và chưa ký của loại số nguyên chuẩn tương ứng có cùng kích thước.

C++, dự thảo ban n3337, 3.9.1/3:

3 Đối với mỗi tiêu chuẩn ký kiểu nguyên, tồn tại một tương ứng (nhưng khác nhau) tiêu chuẩn un- ký kiểu số nguyên: “unsigned char ”,“ unsigned int ngắn ”,“ 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 một yêu cầu liên kết (3.11) như số nguyên đã ký tương ứng45; 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ó. [...]

Đối với C, từ ngữ rất giống

Taken từ dự thảo n1570, 6.2.5/6:

Đối với mỗi loại nguyên ký, có một loại số nguyên tương ứng (nhưng khác) loại (được chỉ định bằng từ khóa chưa được ký) sử dụng cùng một lượng lưu trữ (bao gồm thông tin đăng nhập) và có cùng yêu cầu căn chỉnh. Loại _Bool và các loại số nguyên không dấu tương ứng với số nguyên đã ký chuẩn là loại số nguyên không dấu tiêu chuẩn. Các loại số nguyên không dấu mà tương ứng với các loại số nguyên đã ký mở rộng là các loại số nguyên không dấu mở rộng. Các loại số nguyên không dấu tiêu chuẩn và mở rộng được gọi chung là số nguyên không dấu .

+0

Câu trả lời hay, rất hay khi thấy một trích dẫn thực sự. –

+0

Chữ "có" ban đầu trong câu trả lời của bạn gây nhầm lẫn vì OP đã viết câu hỏi chủ đề và dòng đầu tiên của phần thân câu hỏi ngược lại. :-) –

+0

Tôi đồng ý @R. Tốt hơn rồi? – jrok

2

Nó không thực sự lỗi thời, giống như dự phòng. Tiêu chuẩn này đảm bảo các biến thể đã ký và chưa ký của một loại có cùng kích thước.

0

Bạn luôn có thể đưa vào một số mã như thế này

{ 
char s1[1 + sizeof(int) - sizeof(unsigned int)]; 
char s2[1 + sizeof(unsigned int) - sizeof(int)]; 
} 

(có lẽ chỉ trong debug xây dựng)

này sẽ cung cấp cho bạn một sự thất bại thời gian biên dịch nếu họ kích thước bao giờ khác nhau.

Tôi làm điều này thỉnh thoảng cho mã ed (typedef) cao tôi đang tái cấu trúc.

Nhưng các giống chưa được ký và ký tên luôn có cùng kích thước.

+0

'assert (sizeof (ký int) == sizeof (unsigned int))' hoàn thành cùng với khả năng đọc lớn hơn. –

+0

Nhưng đó không phải là lỗi thời gian chạy? Tôi muốn chặn biên dịch! – Bathsheba

+0

Đối với C++ 11, bạn có thể sử dụng ['std :: static_assert (sizeof (ký int) == sizeof (unsigned int)," size mismatch ");'] (http://en.cppreference.com/w/ cpp/language/static_assert) để nhận lỗi biên dịch. –

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