산술 연산과 overflow [언제나 C언어]

안녕하세요. 언제나 휴일에 언휴예요.

이번 강의는 산술 연산과 overflow 현상을 알아볼게요.

1. 산술 연산
2. overflow

1. 산술 연산

이번 강의에서 다루는 산술 연산은 사칙 연산과 나머지 연산입니다.

연산 기호는 +, -, *, /, %입니다.

사칙 연산 중에 더하기, 빼기, 곱하기는 우리가 생각하는 것과 전혀 차이가 없습니다.

나누기 연산은 사람에 따라 생각이 다소 차이가 있을 수 있어요.

피연산자가 정수일 때 나누기 연산과 나머지 연산을 제공하고 있습니다.

나누기 연산의 결과는 몫입니다. 근사값(반올림 값)이 아닌 몫입니다.

코드로 확인하는 것이 제일 정확합니다.

#include //표준 입출력 헤더
int main()
{
    //+, -, *, /, %
    printf("%d\n", 14 + 3);
    printf("%d\n", 14 - 3);
    printf("%d\n", 14 * 3);
    printf("%d\n", 14 / 3);
    printf("%d\n", 14 % 3);
    return 0;
}

실행 결과는 다음과 같습니다.

17
11
42
4
2

그리고 산술 연산은 피연산자가 하나라도 실수일 때는 연산 결과도 실수입니다.

#include //표준 입출력 헤더
int main()
{
    printf("%f\n", 14 / 3.);
    return 0;
}

실행 결과는 다음과 같습니다.

4.666667

2. overflow

전산에서 범위를 초과하는 것을 overflow라고 말합니다.

메모리 공간을 벗어나는 것도 overflow이며 표현 범위를 벗어나는 것도 overflow입니다.

상한을 벗어나는 것을 overflow, 하한을 벗어나는 것을 underflow로 구분하기도 하지만 통틀어서 overflow라고 말합니다.

C언어에서는 정수나 실수 형식의 표현 범위가 있습니다.

따라서 산술 연산 등의 연산 결과는 표현 범위를 벗어날 수 있습니다.

학습할 때 overflow 현상이 큰 문제를 발생하지는 않습니다.

그렇지만 이러한 현상이 발생할 수도 있다는 것을 한 번 확인하고 넘어갑시다.

int 형식으로 표현할 수 있는 최댓값은 0x7FFFFFFF입니다.

첫 번째 부호 비트가 0이고 나머지 비트가 1인 값이죠.

int 형식으로 표현할 수 있는 최솟값은 0x80000000입니다.

첫 번째 부호 비트가 1이고 나머지 비트가 0인 값입니다.

이러한 이유로 int 형식의 최댓값+1 결과는 최솟값입니다.

최솟값-1 결과는 최댓값입니다.

역시 코드로 보는 것이 정확하죠.

#include //표준 입출력 헤더

int main()
{
    int a = 0x7FFFFFFF; //0111 1111 1111 1111 1111 1111 1111 1111
    int b = 0x80000000; //1000 0000 0000 0000 0000 0000 0000 0000
    printf("%d, %d\n", a, a + 1);
    printf("%d, %d\n", b, b-1);
    system("pause");
    return 0;
}

실행 결과는 다음과 같습니다.

2147483647, -2147483648
-2147483648, 2147483647