INT Overflow(정수 오버플로우)

이영구·2022년 12월 28일
0

Algorithm

목록 보기
17/19

아래 코드를 보고 문제점이 무엇인지 알 수 있는가?

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;
profile
In to the code!

0개의 댓글