所有C和C ++版本中的所有有效类型都是有符号,无符号,长和短吗?

在N3797 7.1.1 / 3中,有以下注释:

Note: Since signed, unsigned, long, and short by default imply int, a type-name appearing after one of those specifiers is treated as the name being (re)declared.

但这只是一个说明。 是否在标准中的某个地方做出了相同的规范性陈述?

在每种情况下,是否使用符合标准的C和C ++来使用signedunsignedlongshort而不使用int

或者,将它放在代码中,是否遵循以下标准?如果是这样,它在哪里这样说?

 signed a; unsigned b; short c; long d; signed f(signed p, unsigned q, short r, long s); unsigned* f(signed* p, unsigned* q, short* r, long* s); 

[我犹豫是否建议或首选,因为害怕获得基于意见的答案。]

据我所知,它一直都是这样,但我们至少可以回到最早的公开标准草案。 对于C ++将是1804并且在7.1.5.2节中简单类型说明符 Table 7 简单类型说明符及其指定的类型包括以下条目:

 unsigned “unsigned int” signed “int” long “long int” short “short int” 

对于C,我们可以回到C99 ,在6.7.2类型说明符中说:

[…]每个类型说明符列表应为以下集合之一(当逗号在一行上有多个集合时,用逗号分隔); […]

并包括以下项目符号:

– short,signed short,short int或signed short int

– int,signed或signed int

– unsigned或unsigned int

– long,signed long,long int或signed long int

因此,这些所有符合标准的类型说明符和两个引号均来自相应标准草案的规范部分。

除了charsigned charchar是不同类型)之外,是的,如果它始终为真,我们可以回到最旧的标准:C89和C ++ 98。

C89§3.5.2类型说明符

每个类型说明符列表应为以下集合之一; 类型说明符可以按任何顺序出现,可能与其他声明说明符混合。

  • void

  • char

  • signed char

  • unsigned char

  • shortsigned shortshort intsigned short int

  • unsigned shortunsigned short int

  • intsignedsigned int或no type specifiers

  • unsignedunsigned int

  • longsigned longlong intsigned long int

  • unsigned longunsigned long int

  • float

  • double

  • long double

  • strucunion说明符

  • enum – 指示符

  • typedef -name

语义

结构,联合和枚举的说明在3.5.2.1到3.5.2.3中讨论.typedef名称的声明在3.5.6中讨论。其他类型的特性在3.1.2.5中讨论

上述每个逗号分隔列表都指定相同的类型,但对于位字段声明,signed int(或signed)可能与int(或没有类型说明符)不同。

类似地在C ++98§7.1.5.2中简单类型说明符:

C ++ 98类型说明符

关于你的问题: 我是否适合使用符合标准的C和C ++来使用signed,unsigned,long和short而不是int在每种情况下?

因为还有unsigned char这样的东西,答案是否定的,而不是在任何情况下 。 即如果您需要unsigned char ,则需要指定char 。 您引用的注释的想法是, 如果未使用显式类型,则默认情况下类型将为int

有关更精确的答案,请阅读c11标准的第6.2.5节。 这里复制了第4和第6段的相关性,但其他部分也将阐明你问题的其他部分:

4

有五种标准的有符号整数类型,指定为signed char,short int,int,long int和long long int。 (这些和其他类型可以用几种其他方式指定,如6.7.2中所述。)也可能存在实现定义的扩展有符号整数类型.38)标准和扩展有符号整数类型统称为有符号整数类型。 )

6

对于每个有符号整数类型,存在相应(但不同)的无符号整数类型(使用关键字unsigned指定),其使用相同数量的存储(包括符号信息)并具有相同的对齐要求。 Bool类型和与标准有符号整数类型对应的无符号整数类型是标准无符号整数类型。 与扩展有符号整数类型对应的无符号整数类型是扩展无符号整数类型。 标准和扩展无符号整数类型统称为无符号整数类型.40)

这里可以找到在线 C ++参考
具体来看属性表。