这个问题是另一个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: warning: integer overflow in expression [-Woverflow]
问题
我是否正确地认为
#1
并#2
调用未定义的行为,因为中间结果100 * 30000000
不适合int
?还是我看到的输出定义明确?为什么我只收到警告
#2
?