使用以下代码片段。
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之外的整数类型的整数转换的整数转换 如果int可以表示源类型的所有值,则rank(4.13)小于int 的等级可以转换为int类型的prvalue;否则,源prvalue 可以转换为unsigned int类型的prvalue。
重点是我的。 可以与必须不一样。
<5> S 5/10说:许多期望算术或枚举类型操作数的二元运算符会以类似的方式导致转换并产生结果类型。目的是产生一个通用类型,它也是结果的类型。这种模式称为通常的算术转换,定义如下:
...
- 否则,应对两个操作数执行整数促销(4.5)。然后是以下 规则应适用于推广的操作数:
- 如果两个操作数具有相同的类型,则不需要进一步转换。
如果未提升值,则后果是计算的中间值超出short int的范围,这意味着答案应为是,这是UB。
这也意味着C和C ++之间存在不太可能的差异。 “兼容性”部分未提及。
我能找到的所有其他问题都涉及类型的混合,签名/未签名等等。这个问题没有具体说明。它出现在我对this的回答中。
任何参赛者?
答案 0 :(得分:4)
4/5更进一步是:
这些转化称为整体促销。
因此,当5/10表示“必须执行整体促销”时,这意味着所需的转换匹配中的任何一个(只有一个匹配)是必需的(在此上下文中)。
“可以”措辞可以保证这些转换是可能的,并且不排除支持其他转换,包括身份转换。但没有其他转换带有整体促销的名称。