这个问题是另一个问题的结果那么问题.
示例代码
#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
and #2
调用未定义的行为,因为中间结果100 * 30000000
不适合int
?或者我看到的输出是明确定义的吗?
为什么我只收到警告#2
?
是的,这是未定义的行为,如果unsigned long
是64位类型。
¹ 这是 UB,所以没有任何保证。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)