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

这个问题是另一个SO question的结果.

示例代码

#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;
}

产量

85
85

使用g -std = c 11 -Wall -pedantic -O0 -Wextra编译此代码会发出以下警告:

9:28:警告:表达式中的整数溢出[-Woverflow]

问题

>我认为#1和#2调用未定义的行为是正确的,因为中间结果100 * 30000000不适合int?或者是我看到明确定义的输出?
>为什么我只收到#2的警告?

最佳答案
是的,它是未定义的行为,如果unsigned long是64位类型,则得到的结果通常是不同的.

¹这是UB,所以没有保证.

转载注明原文:c – 如果表达式的中间结果溢出,它是否是未定义的行为? - 代码日志