2013-06-25 142 views
7

A question最近被問到是否ULLLLU對於指定C中的無符號長長常量是有效的。我知道它們都是有效的,但我認爲ULL會更好,因爲它匹配unsigned long long類型。在C中,'long unsigned'與'unsigned long'一樣有效嗎?

但是,我現在不太確定。該gcc編譯器允許在無投訴以下內容:

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

所以我的問題是:int unsigned,並根據標準的其他變化一樣long long unsigned,有效的類型?

回答

14

的ISO C11標準規定在6.2.5 Types

有五種標準符號整數類型,指定爲符號的字符,短整型,整型,長整型,和long long int類型。

對於每個符號整數類型的,有一個相應的(但不同)的無符號整數類型(與關鍵字無符號指定),其使用存儲(包括符號信息)相同量的並具有相同的對準要求。

但是有在該部分中沒有任務作爲對順序,其中鹼的類型和改性劑unsigned出現。

控制部後來是在標準,6.7.2 Type specifiers,這裏轉述:

類型說明符voidcharshortintlongfloatdoublesignedunsigned_Bool_Complex<struct-or-union-specifier><enum-specifier><typedef-name>

在每個聲明的聲明說明符中和每個結構聲明和類型名稱的說明符限定符列表中至少應該給出一個類型說明符。類型說明符的每個列表應該是以下多個集合之一(當每個項目有多個多重集時,用逗號分隔);類型說明符可能以任何順序出現,可能與其他聲明說明符混合在一起。

然後繼續列出所有的多重配置,如unsigned long, or unsigned long int

但重要的短語有the type specifiers may occur in any order,這意味着這些是所有有效期爲這種多集:

unsigned long 
long unsigned 

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

不要在家裏這樣做。 –

+4

對於一個更加難懂的例子,請注意'typedef int i;'和'int typedef i;'是等價的。 – Mankarse

+0

@Mankarse,好點,6.7允許你重新排序存儲類說明符,比如'typedef'和類型說明符如'int'。如果我在野外看到「int typedef something」,我必須看兩遍。我幾乎肯定會追查並摧毀任何使用'i'作爲類型名稱的人:-) – paxdiablo

0

的符這麼想的事情的順序。

unsigned long long is the same as long long unsigned. 

這兩種類型都是根據C標準(c99)有效。

+1

是從某處引用的,還是隻是將它放在引號框中? – Potatoswatter

+0

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

+0

你怎麼看? – haccks

相關問題