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

时间:2014-03-19 00:28:34

标签: c++ c language-lawyer

在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 ++使用签名未签名在每种情况下 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);

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

3 个答案:

答案 0 :(得分:3)

据我所知,它一直都是这样,但我们至少可以回到最早公开的标准草案。对于C ++,将18047.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

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

答案 1 :(得分:2)

关于你的问题:我是否认为符合标准的C和C ++在每种情况下都使用有符号,无符号,长和短而不使用int?

因为还有unsigned char这样的问题,答案是 否,不是在所有情况下 。即如果您需要unsigned char,则需要指定 char 。你引用的 note 的想法是说如果没有使用显式类型,那么默认类型将是{{ 1}}。

要获得更准确的答案 ,您可以阅读c11标准的第6.2.5节。第4段和第4段6在这里转载它们的相关性,但其他部分也将阐明你问题的其他部分:

4

  

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

6

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

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

答案 2 :(得分:2)

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

  

C89 §3.5.2 Type specifiers

     

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

     
      
  • void

  •   
  • char

  •   
  • signed char

  •   
  • unsigned char

  •   
  • shortsigned shortshort intsigned short int

  •   
  • unsigned shortunsigned short int

  •   
  • intsignedsigned int或无类型说明符

  •   
  • unsignedunsigned int

  •   
  • longsigned longlong intsigned long int

  •   
  • unsigned longunsigned long int

  •   
  • float

  •   
  • double

  •   
  • long double

  •   
  • struc t-or - union说明符

  •   
  • enum - 说明符

  •   
  • typedef - 名称

  •   
     

语义

     

结构,联合和枚举的说明符在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 type specifiers