C++ 标准是否要求升级为 int?

2023-12-01

采取以下代码片段。

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

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

我对C标准的解读是b和c都必须提升为int,因此整个计算必须使用int运算来执行。最终值适合短路,因此不会发生 UB。

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

除 bool、char16_t、char32_t 或 wchar_t 之外的整数类型的纯右值,其整数转换 等级 (4.13) 小于 int 的等级can be如果 int 可以表示源类型的所有值,则转换为 int 类型的纯右值;否则,源右值can be转换为 unsigned int 类型的纯右值。

重点是我的。Can be不等于must be.

S 5/10 说:

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

...

— 否则,应对两个操作数执行积分提升 (4.5)。然后是下面的 规则应适用于提升的操作数:

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

如果不提升这些值,那么结果是计算的中间值超出了short int的范围,这意味着答案应该是肯定的,这就是UB。

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

我能找到的所有其他问题都涉及类型的混合,有符号/无符号等。这个问题没有具体内容。它出现在我的回答中this.

有接受者吗?


再往下 4/5 是:

这些转换称为积分促销.

因此,当 5/10 说“应执行整体促销”时,这意味着需要列出的任一转化匹配(只有一个匹配)(在这种情况下)。

“可以”措辞保证了这些转换是可能的,并且不排除支持其他转换,包括身份转换。但没有其他转换带有以下名称积分推广.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++ 标准是否要求升级为 int? 的相关文章

随机推荐