“长期无符号”在C中是否与“unsigned long”一样有效?

时间:2013-06-25 01:56:52

标签: c types

最近询问question ULLLLU是否有效用于在C中指定无符号长long常量。我知道它们都有效但我在想{{} 1}}会更好,因为它匹配类型ULL

但是,我现在不太确定。 unsigned long long编译器在没有投诉的情况下允许以下内容:

gcc

所以我的问题是:int main(void) { unsigned int a = 1; int unsigned b = 2; return 0; } int unsigned等其他变体,根据标准有效类型吗?

2 个答案:

答案 0 :(得分:15)

ISO {C}标准在6.2.5 Types中声明:

  

有五种标准的有符号整数类型,指定为signed char,short int,int,long int和long long int。

     

对于每个有符号整数类型,都有一个相应的(但不同的)无符号整数类型(使用关键字 unsigned 指定),它使用相同数量的存储(包括符号信息)并具有相同的对齐要求。

但是,该部分没有关于 order 的授权,其中基本类型和unsigned修饰符出现。

控制部分稍后在标准6.7.2 Type specifiers中,在此处解释:

  

类型说明符包括voidcharshortintlongfloatdouble,{{ 1}},signedunsigned_Bool_Complex<struct-or-union-specifier><enum-specifier>

     

每个声明中的声明说明符中应至少提供一个类型说明符,并在每个结构声明和类型名称的说明符限定符列表中指定。每个类型说明符列表应为以下多个集合之一(以逗号分隔,每个项目有多个多集);类型说明符可以按任何顺序出现,可能与其他声明说明符混合。

然后继续列出所有多重集,例如<typedef-name>

但重要的短语是unsigned long, or unsigned long int,意味着所有这些对于该多重集合都有效:

the type specifiers may occur in any order

答案 1 :(得分:0)

说明符的顺序无关紧要。

unsigned long long  is the same as long long unsigned.  

两种类型均符合C标准(c99)。