c++标准要求将其提升为int
Is promotion to int required by the C++ standard?
取以下代码片段
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说"积分促销应执行"时,这意味着所列出的转换中的任何一个匹配(只有一个匹配)都是必需的(在此上下文中)。
"可以"的措辞保证了这些转换是可能的,并且不排除支持其他转换,包括标识转换。但是没有其他转换带有积分提升的名称。
- 在标准中,模板参数的语法在哪里定义,例如,'std::function<int(char)>'?
- 查找不在标准中的第一个值::设置<int>最小-最大值
- 标准::p空气<矢量、双精度的初始值设定项列表<int>>
- C++ 标准::矢量<int>问题
- 将标准:设置为<int> jintArray
- 在我的项目中包括eigen将标准INT定义为eigen :: denseIndex-如何使用正常INT
- 根据C++标准,int 变量是对象吗?
- 将标准::矢量<int>保存到文件
- 收到错误:C3867 '<int>Template_class::add':非标准语法;将指针指向带有模板的函数时
- C++11标准是否保证"auto n2 = const_cast<int&>(n);" "n2 is int&"?
- 标准的C 行为对未签名的INT转换的签名char
- 如何计算标准::矢量::<int>迭代器和标准::矢量<int>::reverse_iterator之间的距离?
- 转换 int -> 无符号长 长 是否由标准定义
- 标准的大小::函数<void(int&)>类型
- 为什么class {int i;};不是完全标准符合性的
- 将int重新解释为float的最有效的标准兼容方式
- 如何忽略标准输入中的下一个int
- itoa()的C++标准替代品,用于将int转换为基本的10 char*
- 标准::地图按值大小排序(设置<int>)
- C++将布尔强制转换为int标准