2013-06-25 44 views
7

A question gần đây đã được hỏi về việc ULL hoặc LLU có hợp lệ để chỉ định các hằng số dài chưa ký trong C. Tôi biết chúng đều hợp lệ nhưng tôi đã nghĩ rằng ULL sẽ thích hợp hơn vì nó khớp với loại unsigned long long.Là 'dài unsigned' là hợp lệ như 'unsigned long' trong C?

Tuy nhiên, hiện tại tôi không chắc chắn lắm. Trình biên dịch gcc cho phép sau đây mà không phàn nàn:

int main(void) { 
    unsigned int a = 1; 
    int unsigned b = 2; 
    return 0; 
} 

Vì vậy, câu hỏi của tôi là: là int unsigned, và các biến thể khác như long long unsigned, các loại hợp lệ theo tiêu chuẩn?

Trả lời

14

ISO C11 tiêu chuẩn quốc gia trong 6.2.5 Types:

Có năm loại nguyên ký tiêu chuẩn, định là char ký, ngắn int, int, int dài, và int lâu dài.

Đối với mỗi loại số nguyên đã ký, có loại số nguyên không tương ứng (nhưng khác) được chỉ định bằng từ khóa unsigned) sử dụng cùng một lượng bộ nhớ (bao gồm thông tin ký) và có cùng yêu cầu căn chỉnh .

Tuy nhiên không có nhiệm vụ trong phần đó như đến trật tự trong đó các loại cơ sở và unsigned modifier xuất hiện.

Phần kiểm soát là sau này trong tiêu chuẩn, 6.7.2 Type specifiers, diễn giải ở đây:

Loại specifiers là void, char, short, int, long, float, double, signed, unsigned, _Bool, _Complex, <struct-or-union-specifier> , <enum-specifier><typedef-name>.

Ít nhất một trình chỉ định loại phải được đưa ra trong các trình khai báo khai báo trong mỗi khai báo và trong danh sách trình định danh định danh trong mỗi khai báo cấu trúc và tên loại. Mỗi danh sách các kiểu chỉ định sẽ là một trong các multiset sau đây (được phân định bằng dấu phẩy, khi có nhiều hơn một multiset cho mỗi mục); các kiểu chỉ định có thể xảy ra theo bất kỳ thứ tự nào, có thể xen kẽ với các bộ khai báo khác.

Sau đó, nó sẽ liệt kê tất cả các multisets, chẳng hạn như unsigned long, or unsigned long int.

Nhưng cụm từ quan trọng có the type specifiers may occur in any order, có nghĩa là tất cả trong số này là hợp lệ cho MultiSet rằng:

unsigned long 
long unsigned 

unsigned long int 
unsigned int long 
long unsigned int 
long int unsigned 
int unsigned long 
int long unsigned 
+5

Đừng làm điều này ở nhà. –

+4

Đối với một ví dụ tối nghĩa hơn, lưu ý rằng 'typedef int i;' và 'int typedef i;' là tương đương. – Mankarse

+0

@Mankarse, điểm tốt, 6.7 cho phép bạn sắp xếp lại các thông số lớp lưu trữ như 'typedef' và gõ specifiers như' int'. Tôi sẽ phải nhìn hai lần nếu tôi từng thấy 'int typedef something' trong tự nhiên. Tôi gần như chắc chắn theo dõi và tiêu diệt bất cứ ai sử dụng 'i' như một tên loại :-) – paxdiablo

0

Thứ tự của các vấn đề specifier doesnt.

unsigned long long is the same as long long unsigned. 

Cả hai loại đều hợp lệ theo tiêu chuẩn C (c99).

+1

Điều này được trích dẫn từ một nơi nào đó cụ thể hoặc bạn chỉ cần đặt nó trong một hộp báo giá? – Potatoswatter

+0

http://stackoverflow.com/questions/17287680/literal-types-0x1ull-vs-0x1llu – haccks

+0

Bạn nghĩ sao? – haccks

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