如果表达式的中间结果溢出,是否属于未定义行为?

2023-11-24

这个问题是另一个问题的结果那么问题.

示例代码

#include <iostream>

int main()
{
    unsigned long b = 35000000;
    int i = 100;
    int j = 30000000;
    unsigned long n = ( i * j ) / b; // #1
    unsigned long m = ( 100 * 30000000 ) / b; // #2
    std::cout << n << std::endl;
    std::cout << m << std::endl;
}

Output

85
85

编译此代码g++ -std=c++11 -Wall -pedantic -O0 -Wextra给出以下警告:

9:28: warning: integer overflow in expression [-Woverflow]

问题

  1. 我的想法正确吗#1 and #2调用未定义的行为,因为中间结果100 * 30000000不适合int?或者我看到的输出是明确定义的吗?

  2. 为什么我只收到警告#2?


是的,这是未定义的行为,如果unsigned long是64位类型。

¹ 这是 UB,所以没有任何保证。

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

如果表达式的中间结果溢出,是否属于未定义行为? 的相关文章

随机推荐