14 곱셈, 나눗셈하기

이번에는 곱셈과 나눗셈을 하는 방법을 알아보겠습니다.

14.1 곱셈, 나눗셈하기

먼저 정수의 곱셈과 나눗셈입니다. 다음과 같이 곱셈은 * 연산자, 나눗셈은 / 연산자를 사용합니다. 단, 수학에서 사용하는 ×, ÷ 기호는 사용할 수 없습니다.

  • a * b
  • a / b

mul_div_integer.c

#include <stdio.h>

int main()
{
    int num1;
    int num2;

    num1 = 2 * 3;    // 2에 3를 곱해서 num1에 저장
    num2 = 7 / 2;    // 7에서 2를 나누어서 num2에 저장

    printf("%d\n", num1);    // 6
    printf("%d\n", num2);    // 3: 소수점을 사용하지 않고 최대한 나눌 수 있는 값이 3

    return 0;
}

실행 결과

6
3

곱셈은 특별한 것이 없습니다. 하지만 나눗셈은 결과를 보면 3.5가 아니라 3이 나옵니다. 왜냐하면 C 언어에서는 정수끼리 나눗셈을 하면 결과도 정수가 나오기 때문입니다. 즉, 7을 2로 나누었을 때 소수점을 사용하지 않으면서 최대한 나눌 수 있는 값이 3입니다.

나눗셈에서 또 한가지 주의해야 할 점은 컴퓨터에서 정수를 0으로 나눌 수 없다는 점입니다. 다음과 같이 소스 코드에서 정수를 0으로 직접 나누면 컴파일 에러가 발생합니다.

num1 = 1 / 0;    // 1을 0으로 나눔. 컴파일 에러 발생

컴파일 결과

mul_div_integer.c(9): error C2124: 0으로 나누기 또는 나머지 연산을 수행했습니다.

만약 변수에 정수와 0을 저장해서 나누면 컴파일 에러는 발생하지 않지만 실행을 하면 에러가 발생합니다.

div_zero_integer_error.c

#include <stdio.h>

int main()
{
    int num1 = 1;
    int num2 = 0;
    int num3;
    
    num3 = num1 / num2;    // 1을 0으로 나눔. 실행 에러 발생

    printf("%d\n", num3);

    return 0;
}

실행 결과

0x00AB1690에(div_zero_integer_error.exe의) 처리되지 않은 예외가 있습니다. 0xC0000094: Integer division by zero.

실행을 하다가 정수를 0으로 나누는 부분이 나오면 에러가 발생합니다. 특히 실무에서도 정수를 0으로 나누는 버그는 생각보다 많이 나오므로 주의해야 합니다.

이번에는 실수를 계산해보겠습니다.

mul_div_real_number.c

#include <stdio.h>

int main()
{
    float num1;
    float num2;

    num1 = 2.73f * 3.81f;    // 2.73에 3.81f을 곱해서 num1에 저장
    num2 = 7.0f / 2.0f;      // 7.0에서 2.0을 나누어서 num2에 저장

    printf("%f\n", num1);    // 10.401299
    printf("%f\n", num2);    // 3.500000

    return 0;
}

실행 결과

10.401299
3.500000

앞의 정수끼리 나눗셈과는 달리 실수끼리 나눗셈을 하면 소수점 이하 자리까지 계산이 됩니다. 즉, 7.0에서 2.0을 나누었으므로 3.5가 나옵니다.

실수 계산에서 한가지 특이한 점은 계산 결과에서 오차가 발생한다는 점입니다. 다음과 같이 2.73에 3.81을 곱하면 10.4013이 나와야 하는데 10.401299가 나옵니다.

printf("%f\n", 2.73f * 3.81f);    // 10.401299: 실제 계산 값은 10.4013

실수의 계산 오차는 곱셈뿐만 아니라 덧셈, 뺄셈, 나눗셈에서도 나타납니다. 오차 문제는 다소 어려운 주제이므로 지금은 크게 신경 쓰지 않아도 됩니다. 나중에 실무에서 실수를 다룰 때 오차에 대한 적절한 처리가 필요하며 자세한 내용은 '부록 4. 실수 자료형의 오차'를 참조하세요.

실수도 소스 코드에서 0으로 직접 나누면 컴파일 에러가 발생합니다.

num1 = 1.0f / 0.0f;   // 1.0을 0.0으로 나눔. 컴파일 에러 발생

컴파일 결과

mul_div_real_number.c(8): error C2124: 0으로 나누기 또는 나머지 연산을 수행했습니다.

하지만 다음과 같이 변수에 실수와 0.0을 저장해서 나누면 결과가 정수와는 조금 다르게 나옵니다.

div_zero_real_number_error.c

#include <stdio.h>

int main()
{
    float num1 = 1.0f;
    float num2 = 0.0f;
    float num3;

    num3 = num1 / num2;

    printf("%f\n", num3);    // inf: 무한대

    return 0;
}

실행 결과

inf

실숫값에 0.0을 나누면 실행이 중단되지 않고 무한대(inf)가 나옵니다. 무한대 처리에 대한 자세한 내용은 '부록 5. 실수의 무한대와 숫자가 아닌 값 검사'를 참조하세요.

참고 | 0을 어떤 수로 나누면 어떻게 되나요?

0 / 10과 같이 0을 10으로 나누면 결과는 0입니다. 즉, 0 / 10 = 0에서 10을 등호 오른쪽으로 보내면 0 = 0 * 10이 되므로 올바른 식입니다.