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

pax*_*blo 8 c types

一个问题是最近被问及是否ULLLLU有效期为在指定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)

  • 不要在家里这样做. (5认同)
  • 对于一个更加模糊的例子,请注意`typedef int i;`和`int typedef i;`是等价的. (4认同)