sizeof(short)== sizeof(int)

时间:2015-06-04 13:42:21

标签: c++ language-lawyer

背景

我正在研究C ++中的整数提升规则,并且遇到了以下内容(取自n4296):

  

4.5.1 [pconv.prom]

     

boolchar16_tchar32_twchar_t以外的整数类型的prvalue,其整数转换等级(4.13)小于{{的等级如果int可以表示源类型的所有值,则可以将1}}转换为int类型的prvalue;   否则,源prvalue可以转换为类型的prvalue   int

  

4.13.1.3 [conv.rank]

     
      
  • unsigned int的等级应大于long long int的等级,该等级应大于long int的等级,   应大于int的等级,该等级应更大   比short int
  • 的等级   

  

5.10 [expr]

     

许多期望算术或枚举类型操作数的二元运算符会导致转换并产生结果   以类似的方式输入类型。目的是产生一种共同的类型   也是结果的类型。这种模式通常被称为   算术转换,定义如下:

     

[省略多点]

     
      
  • 否则,应对两个操作数执行整体促销(4.5)。
  •   
     

[进一步遗漏]

问题

鉴于signed char的大小和范围可能都等于short int的大小和范围,在这些情况下将int提升为short int似乎是不必要的。然而,上面没有提到这样的例外。

在这些情况下,标准是否要求int被提升为short int(即使实现优化在同一个可执行文件中生成)?

注意/附加问题

我也注意到措辞使用“可以”而不是“应该”,这是故意的吗?

1 个答案:

答案 0 :(得分:2)

这是完全合法的,并且曾经非常普遍,self.publishEvent("render",msg); self.publishEvent("render",msg2); short具有相同的范围和表示;即使在今天,嵌入式系统对两者使用相同的16位表示也并不罕见。 C规范确实包含某些特定于此类实现的语言,因为在此类平台上int会升级到unsigned short,而它会在平台上升级到unsigned int,后者类型可以表示所有值signed int。它不会将此类实现从要求将小于unsigned shortint的类型提升为其中之一的规则中豁免,因为这样的豁免不会获得任何好处。

该标准允许实现可以以其认为合适的任何方式执行计算,如果在unsigned intint指示的促销将产生定义的行为的所有情况下,实现的计算产生该计算相同的行为( as-if 规则)。如果类型unsigned intint的rvalues的行为无法区分,那么这意味着实现可以在short而不是short执行计算,如果它选择这样做的话。由于as-if规则已经足够,因此无需在促销中为标准免除int大小的int类型添加规则。