2012-05-27 25 views
16

Tôi đã đọc một vài lần ở các nguồn khác nhau (ví dụ: Wikipedia: http://en.wikipedia.org/wiki/C_variable_types_and_declarations#Size), trong C, một thời lượng dài không nhỏ hơn một dài, không nhỏ hơn một int, không nhỏ hơn một đoạn ngắn."int" thực sự yêu cầu phải có ít nhất là lớn như "ngắn" trong C?

Tuy nhiên, tôi đã xem xét điều này theo các tiêu chuẩn C90 và C99 và không tìm thấy mệnh đề tương ứng. Tôi đã chỉ thấy rằng C90 và C99 chỉ định kích thước loại tối thiểu (Mục 5.2.4.2.1 trong tiêu chuẩn C90 và C99), nhưng không phải kích thước của chúng có liên quan với nhau. Tôi đã bỏ lỡ một cái gì đó trong các tiêu chuẩn?

+4

Không, nhưng tôi chưa thấy một nền tảng làm cho 'ngắn hơn' lớn hơn' int' ... và đó chính xác là lý do tại sao tôi sử dụng ' ', bất cứ khi nào tôi nghi ngờ về những thứ như vậy –

Trả lời

13

6.3.1.1 xác định hàng tương ứng xếp hạng chuyển đổi nguyên của bất kỳ hai loại số nguyên nào. Đây là một khái niệm trừu tượng có nghĩa là chỉ để xác định mối quan hệ giữa hai loại; không có giá trị nào được xác định là xếp hạng thuộc bất kỳ loại nào.

6.2.5p8 nói:

Đối với bất kỳ hai loại nguyên với signedness giống nhau và khác nhau nguyên rank chuyển đổi (xem 6.3.1.1), phạm vi giá trị của loại với xếp hạng chuyển đổi số nguyên nhỏ hơn là một giá trị phụ của các giá trị của loại khác.

Nó không nói bất cứ điều gì về họ tương đối kích thước, và trong thực tế đó là về mặt lý thuyết có thể cho một phù hợp (nhưng cố tình ngoan cố) thực hiện để có sizeof (short) > sizeof (int). Điều này chỉ có thể nếu short có nhiều bit đệm (các bit không đóng góp giá trị) hơn int. Điều này là rất khó xảy ra; hầu hết các triển khai không có bit đệm ở tất cả và tôi biết không có triển khai nào trong đó các mối quan hệ của các phạm vi của các loại số nguyên khác với các mối quan hệ về kích thước của chúng.

Tham chiếu: N1256, bản nháp C99 mới nhất hoặc N1570, bản nháp C2011 mới nhất.

+0

Cảm ơn thông tin bổ sung :) –

10

tôi cho rằng các bài viết Wikipedia là đề cập đến phạm vi giá trị của các loại nguyên, chứ không phải là kích thướccủa họ (theo báo cáo của sizeof).

Từ C99 standard draft N1256:

6.3.1.1/1

Xếp hạng của long long int sẽ lớn hơn cấp bậc long int, mà sẽ lớn hơn cấp bậc int, mà phải lớn hơn xếp hạng của short int, phải lớn hơn xếp hạng signed char.

6.2.5/8

Đối với bất kỳ hai loại nguyên với signedness giống nhau và khác nhau rank chuyển đổi số nguyên (xem 6.3.1.1), phạm vi của các giá trị của các loại với nhỏ xếp hạng chuyển đổi số nguyên là một số phụ của các loại giá trị khác là .

+0

't hoàn toàn trả lời câu hỏi. Xếp hạng chuyển đổi tương đối không thực sự hàm ý bất kỳ điều gì về kích thước tương đối. –

6

Từ C2011 Standard

6.3.1.1/1

- Mức xếp hạng của lâu dài int sẽ lớn hơn cấp bậc dài int, mà sẽ lớn hơn xếp hạng int, phải lớn hơn xếp hạng ngắn int, sẽ lớn hơn xếp hạng đã ký char.