CS50
하드웨어의 한계(Overflow 문제)
XZXXZX
2022. 4. 20. 08:57
728x90
반응형
컴퓨터는 프로그램을 구동하기 위해 다양한 물리적 장치를 사용한다. 그 중 하나는 메모리로, 프로그램이 필요한 정보가 저장되는 곳이다. 메모리의 용량은 무한하지 않기 때문에, 때때로 프로그램에서 우리가 의도하지 않은 오류가 발생하기도 한다.
컴퓨터는 RAM(랜덤 액세스 메모리, Random Access Memory)이라는 물리적 장치를 포함하고 있다. 작성한 프로그램은 구동 중에 RAM에 저장되는데, RAM은 유한한 크기의 비트만 저장할 수 있기 때문에 때때로 부정확한 결과를 내기도 한다.
오버플로우 - 컴퓨터 하드웨어의 한계로 인해 발생하는 문제 중 하나로, 변수가 담을 수 있는 최대 허용 범위를 벗어난 값을 저장해 예상치 못한 결과가 나오는 현상
부동 소수점 부정확성
#include <cs50.h>
#include <stdio.h>
int main(void)
{
// 사용자에게 x 값 받기
float x = get_float("x: ");
// 사용자에게 y 값 받기
float y = get_float("y: ");
// 나눗셈 후 출력
printf("x / y = %.50f\\n", x / y);
}
위 코드는 실수 x, y 를 인자로 받아 x 나누기 y를 하는 프로그램이다.
x: 1
y: 10
x / y = 0.10000000149011611938476562500000000000000000000000
나눈 결과를 소수점 50자리까지 출력하기로 하고, x에 1을 y에 10을 입력하면 위와 같은 결과가 나온다.
결과는 0.1로 나와야 하지만 float에서 저장 가능한 비트 수가 유한하기 때문에 0.1과 다른 결과값이 나오게 된다.
정수 오버플로우
비슷한 오류로, 1부터 시작하여 2를 계속해서 곱하여 출력하는 프로그램이 있다고하면
#include <stdio.h>
#include <unistd.h>
int main(void)
{
for (int i = 1; ; i *= 2)
{
printf("%i\\n", i);
sleep(1);
}
}
위와 같이 작성할 수 있다.
변수 i를 int로 저장하기 때문에, 2를 계속 곱하다가 int 타입이 저장할 수 있는 수를 넘은 이후에는 아래와 같은 에러 메시지와 함께 0이 출력된다.
<터미널 출력 결과>
...
1073741824
overflow.c:6:25: runtime error: signed integer overflow: 1073741824 * 2 cannot be represented in type 'int'
-2147483648
0
0
...
정수를 계속 키우는 프로그램에서 10억을 넘기자 앞으로 넘어갈 1의 자리가 없어진 것이다.
int에서는 32개의 비트가 다였기 때문이다. 그 때문에 그 이상의 숫자는 저장할 수 없는 것이다.
728x90
반응형