一个问题是最近被问及是否ULL或LLU有效期为在指定C.为unsigned long long常量我知道他们俩都是有效的,但我在想,ULL将是可取的,因为它相匹配的类型unsigned long long.
但是,我现在不太确定.该gcc编译器允许毫无怨言以下几点:
int main(void) {
unsigned int a = 1;
int unsigned b = 2;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
所以我的问题是:是int unsigned和其他变体一样long long unsigned,根据标准的有效类型?
pax*_*blo 15
ISO C11标准规定6.2.5 Types:
有五种标准的有符号整数类型,指定为signed char,short int,int,long int和long long int.
对于每个有符号整数类型,存在相应的(但不同的)无符号整数类型(使用关键字unsigned指定),它使用相同数量的存储(包括符号信息)并具有相同的对齐要求.
但是,在该部分中没有关于基本类型和修饰符出现的顺序的任务unsigned.
控制部分后来在标准中,在此6.7.2 Type specifiers解释:
类型说明符
void,char,short,int,long,float,double,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,意味着 所有这些都适用于该多重集:
unsigned long
long unsigned
unsigned long int
unsigned int long
long unsigned int
long int unsigned
int unsigned long
int long unsigned
Run Code Online (Sandbox Code Playgroud)