2013-06-25 141 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

相关问题