最近询问question ULL
或LLU
是否有效用于在C中指定无符号长long常量。我知道它们都有效但我在想{{} 1}}会更好,因为它匹配类型ULL
。
但是,我现在不太确定。 unsigned long long
编译器在没有投诉的情况下允许以下内容:
gcc
所以我的问题是:int main(void) {
unsigned int a = 1;
int unsigned b = 2;
return 0;
}
和int unsigned
等其他变体,根据标准有效类型吗?
答案 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
中,在此处解释:
类型说明符包括
void
,char
,short
,int
,long
,float
,double
,{{ 1}},signed
,unsigned
,_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)。