[C++] 중간값 구하기 (feat. Overflow)

Singery00·2024년 4월 2일
0

C++

목록 보기
2/7
post-thumbnail

개요

💡 중간값을 구하는 로직을 작성하며 예전에 배운 내용이 생각나서 포스팅하게 되었다.

코딩테스트를 공부하며 여러 로직을 작성하다보면 중간값을 구해야 하는 상황이 나타난다.

"엥 그냥 더하고 2로 나누면 되는거 아닌가?"

맞는 말이다. 하지만 우리는 프로그래머니까 좀 더 깊게 들어가보자.


본론


중간값 구하기

정수 num1과 num2가 있을 때, 그 중간값을 구해보자.
아래와 같이 작성할 수 있다.

#include <iostream>

int main()
{
	int num1 = 10, num2 = 20;

	int middle = (num1 + num2) / 2;

	std::cout << middle << std::endl;
}

>> 15

10과 20을 넣어서 중간값인 15가 나오는걸 확인했다. 👍

이번엔 다른 코드로 동작해보자.

#include <iostream>

int main()
{
	int num1 = 10, num2 = 20;

	int middle = num1 + (num2 - num1) / 2;

	std::cout << middle << std::endl;
}

>> 15

같은 결과값 15를 도출했다.

두 코드의 가장 큰 차이점이 뭘까?


Overflow

  • 오버플로우 (Overflow)
    표현 범위를 초과하여 최대값을 넘어갔을 때 발생하는 현상이다.

우리는 C++에서 정수를 사용할 때 int형을 사용한다.
C++에서 int는 일반적으로 4Byte(32bit)의 크기를 가진다.

(양수) 0 1111111 11111111 11111111 11111111
~
(음수) 1 1111111 11111111 11111111 11111111
로 -2,147,483,648부터 2,147,483,647까지 값을 표현할 수 있다.

이 개념을 알고 다시 보자.


중간값 구하기 (값이 매우 크다면?)

10과 20이 아닌 엄청나게 큰 수를 넣어보자.

1,000,000,000과 2,000,000,000를 각각 넣어서 실행해보자.

#include <iostream>

int main()
{
	int num1 = 1000000000, num2 = 2000000000;

	int middle = (num1 + num2) / 2;

	std::cout << middle << std::endl;
}

>> -647483648

예상한 중간값인 1,500,000,000은 나오지 않고 이상한 결과가 나왔다.

이번엔 다른 코드로 동작해보자.

#include <iostream>

int main()
{
	int num1 = 1000000000, num2 = 2000000000;

	int middle = num1 + (num2 - num1) / 2;

	std::cout << middle << std::endl;
}

>> 1500000000

예상한 결과값 1,500,000,000 도출했다.

이유가 뭘까?
num1과 num2를 더하면서 int가 표현가능한 값의 범위를 넘어가서 overflow가 발생한 것이다.

직접 3,000,000,000을 대입하고 출력해보면 확실하게 결과를 볼 수 있다.

#include <iostream>

int main()
{
	int n3 = 3000000000;
	std::cout << n3 << std::endl;
}

>> -1294967296

이러한 이유로 우리는 1번째 코드보단 2번째 코드를 사용하는 것이 좀 더 안전하다.


마무리

간단하지만 간과할 수 있는 내용에 대해서 작성해보았다.
한번씩 상기시켜주도록 하자

profile
게임 개발자가 되어보자

0개의 댓글