irsam78   2년 전

1234567891이 int 범위에 들어가길래 계산할때 어차피 모듈러를 쓰니까 상관없을 거라 생각하고 int를 사용했습니다. 그런데 큰 값에서 음수로 나오고 하는걸 보니 아무래도 오버플로우가 생기는것 같습니다.

여기서 의문이 계산과정에서 계속 모듈러를 사용해주면  대입 직전 그러니까 모듈러 연산을 하기 직전에만 int범위를 넘어설텐데 오버플로우가 생긴다는건 그때도 그 변수의 자료형을 따라서 계산하기 때문인건가요? 그렇다면 왜 아래 코드에서 sum은 별 문제가 없는지..

결국 long long으로 처리하고 해결하기는 했지만 왜 이런 일이 생기는지 궁금해서 글을 남겨봅니다.

lcr7324   2년 전

변수에 계산 결과값을 대입할 때는 계산이 다 이뤄진 "후에" 변수의 자료형에 맞추어 형변환이 일어납니다.

예를 들어 long long x = 123456789 * 987654321; 같은 경우라면, 우변의 식이 int형으로 계산된 "후에" 그 결과값을 long long 형으로 변환하여 x에 저장하게 됩니다. 이 경우라면 오버플로우가 일어나겠지요.

이런 일을 막고 싶으면 계산 과정에서 명시적으로 형변환을 해주면 됩니다. long long x = (long long)123456789 * 987654321; 같은 방식으로 작성하면, 곱셈 자체가 long long과 int의 곱셈이므로 오버플로우 없이 long long의 결과를 얻게 되고 이를 그대로 x에 저장하게 됩니다.

댓글을 작성하려면 로그인해야 합니다.