아래 코드를 보고 문제점이 무엇인지 알 수 있는가?
C 코드의 정수형 int의 범위는 다음과 같다.
4 Bytes를 기준으로 하여, 아래의 범위에 해당한다. 대략 -20억에서 20억까지.
int 범위 (4 Bytes) : –2,147,483,648 ~ 2,147,483,647
int 범위를 알기 때문에 int를 선언하고 변수 자체에 20억이 넘는 값을 넣는 경우는 드물다.
다만 int 변수를 long long 등의 변수로 변환해야 하는 경우에 아래와 같이 문제가 발생할
수 있는데, 그 이유는 연산의 순서와 관련이 있다.
int형 변수 x int형 변수 값은 일단 int형변수로 관리된다.
즉, (long long)(int형 변수 x int형 변수)로 형변환 이전에 이미 int overflow가 일어난다는 이야기.
따라서 int형 변수끼리의 곱셈에는 주의가 필요하다.
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
int n = 3;
int m = 10;
int k = 2000000000;
long long ans = 0;
long long ans2 = 0;
ans += (long long)(n+m)*k; // (n+m)을 먼저 long long으로 변환 후에 * k하면 overflow가 없음
ans2 += (long long)((n+m)*k); // (n+m)*k 은 int형이므로 overflow 발생
cout << ans << '\n';
cout << ans2 << '\n';
return 0;
}
백준 12016 라운드 로빈 스케줄러
위 문제의 아래 코드 라인에서 문제를 발견하지 못해, 한참을 해맨 내용.. 아놔..
total += (long long)(arr[i].first-last) * member;