c++标准要求将其提升为int

Is promotion to int required by the C++ standard?

本文关键字:int 标准 c++      更新时间:2023-10-16

取以下代码片段

short int a, b = 30001, c = 30002, d = 30003;
a = b + c - d;

假设short int为16位,int为32位。这是c++中未定义的行为吗?

我对C标准的理解是b和C都必须被提升为int,所以整个计算必须使用int算术来执行。最终值适合于一个short,因此不会发生UB。

我在c++标准中找不到相应的语言。关于整数提升的章节(n3797 S4.5/1)说:

非bool、char16_t、char32_t或wchar_t的整型右值如果int可以表示源类型的所有值,则可以将转换为int类型的右值;否则,源prvalue 可以转换为unsigned int类型的prvalue。

重点是我的。可以必须不一样。

S 5/10说:

许多期望操作数为算术或枚举类型的二元操作符以类似的方式引起转换并产生结果类型。目的是产生一个公共类型,这也是结果的类型。这种模式称为常规算术转换,定义如下:

—否则,两个操作数都要进行积分提升(4.5)。接下来是规则适用于提升的操作数:

—如果两个操作数具有相同的类型,则不需要进一步的转换。

如果值没有提升,则结果是计算的中间值超出了short int的范围,这意味着答案应该是yes,这是UB。

这也意味着C和c++之间不太可能存在差异。在兼容性部分没有提到。

我能找到的所有其他问题都涉及类型的混合,有符号/无符号等。没有特别提到这个问题。它产生于我对这个问题的回答。

人吗?

在4/5的下面是:

这些转换称为积分提升

因此,当5/10说"积分促销应执行"时,这意味着所列出的转换中的任何一个匹配(只有一个匹配)都是必需的(在此上下文中)。

"可以"的措辞保证了这些转换是可能的,并且不排除支持其他转换,包括标识转换。但是没有其他转换带有积分提升的名称。