この質問は、別のSO質問の結果です。
サンプルコード
#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
ですか?