我正在研究C ++中的整数提升规则,并且遇到了以下内容(取自n4296):
4.5.1 [pconv.prom]
除
bool
,char16_t
,char32_t
或wchar_t
以外的整数类型的prvalue,其整数转换等级(4.13)小于{{的等级如果int
可以表示源类型的所有值,则可以将1}}转换为int
类型的prvalue; 否则,源prvalue可以转换为类型的prvalueint
。
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
(即使实现优化在同一个可执行文件中生成)?
我也注意到措辞使用“可以”而不是“应该”,这是故意的吗?
答案 0 :(得分:2)
这是完全合法的,并且曾经非常普遍,self.publishEvent("render",msg);
self.publishEvent("render",msg2);
和short
具有相同的范围和表示;即使在今天,嵌入式系统对两者使用相同的16位表示也并不罕见。 C规范确实包含某些特定于此类实现的语言,因为在此类平台上int
会升级到unsigned short
,而它会在平台上升级到unsigned int
,后者类型可以表示所有值signed int
。它不会将此类实现从要求将小于unsigned short
或int
的类型提升为其中之一的规则中豁免,因为这样的豁免不会获得任何好处。
该标准允许实现可以以其认为合适的任何方式执行计算,如果在unsigned int
或int
指示的促销将产生定义的行为的所有情况下,实现的计算产生该计算相同的行为( as-if 规则)。如果类型unsigned int
和int
的rvalues的行为无法区分,那么这意味着实现可以在short
而不是short
执行计算,如果它选择这样做的话。由于as-if规则已经足够,因此无需在促销中为标准免除int
大小的int
类型添加规则。