프로그래밍 언어/C

[C언어 참조] 정수와 실수의 표현

순정법사 2023.08.17

A. 정수의 표현

1. 정수의 표현

컴퓨터에서 정수를 표현하는 방법은 아래 두가지로 생각할 수 있음

 

a. 부호 없는 정수

해당 정수 크기의 절댓값을 2진수로 변환하여 표현

 

b. 부호 있는 정수

음수를 표현하는 3가지 방법이 있음

 

  • 부호 비트와 절댓값 방법
  • 1의 보수법
  • 2의 보수법

 

 

2. 음수의 표현

a. 부호 비트와 절댓값 방법

🌟 최상위 1비트로 부호를 표현하고, 나머지 비트로 해당 정수의 절댓값을 표현하는 방법

 

최상위의 1비트가 부호를 표현하기 위해 사용되어 표현할 수 있는 절댓값의 범위는 절반으로 줄어들지만

음수를 표현할 수 있어서 총 표현할 수 있는 크기는 거의 비슷함

 

💥 이 방법은 +0과 -0이 따로 존재하게 됨

 

b. 1의 보수법

🌟 해당 양수의 모든 비트를 반전하여 음수를 표현하는 방법

 

이 방법은 음수를 비트 NOT 연산만으로 표현할 수 있어서 연산이 매우 간단해짐

 

간단한 연산

 

💥 이 방법은 아래와 같이 부호 비트와 절댓값 방법과 같이 +0과 -0이 따로 존재하게 됨

 

c. 2의 보수법

🌟 해당 양수의 모든 비트를 반전한 1의 보수에 1을 더하여 음수를 표현하는 방법

 

두 개의 0을 가지는 문제점(+0과 -0)을 해결하기 위해 고안

👉 대부분의 시스템에서는 모두 2의 보수법으로 음수를 표현

 

-0은 2의 보수를 구하는 과정에서 최상위 비트를 초과한 오버플로우가 발생하여 +0

따라서 2의 보수법에서는 단 하나의 0만이 존재

 

 

 

 


B. 실수의 표현

2진수로만 표현해야 하기 때문에 실수를 표현하는 방식은 정수보다 복잡함

현재는 고정, 부동 소수점 방식을 사용함

 

1. 실수의 표현

a. 고정 소수점(fixed point) 방식

실수를 정수부 / 소수부로 나누어 소수부의 자릿수를 미리 정해놓고, 고정된 자릿수로 소수를 표현하는 것

정수부와 소수부의 자릿수가 크지 않으므로, 표현할 수 있는 범위가 매우 적다는 단점이 있음

 

32비트 실수를 고정 소수점 방식으로 표현하면 다음과 같음

 

 

b. 부동 소수점(floating point)  방식

실수를 가수부와 지수부로 나누어 표현 

고정 소수점 방식과 다르게 매우 큰 실수까지도 표현할 수 있게 됨

 

👉 대부분의 시스템에서 이용하는 방식

 

 

1) IEEE 부동 소수점 방식

현재 사용되고 있는 부동 소수점 방식은 대부분 IEEE 754 표준을 따름

32비트의 float형 실수를 IEEE 부동 소수점 방식으로 표현
64비트의 double형 실수를 IEEE 부동 소수점 방식으로 표현

 

 

💥 부동 소수점 방식의 오차

 

고정 소수점 방식보다 훨씬 더 많은 범위까지 표현하지만, 

부동 소수점 방식에 의한 실수의 표현은 항상 오차가 존재한다는 단점이 있음

 

오차는

이 공식때문에 발생하는데,

이 공식을 사용하면 표현의 범위는 늘어나지만, 10진수를 정확하게 표현할 수는 없게 되기 때문

따라서 컴퓨터에서 실수를 표현하는 방법은 언제나 근사치를 표현한다 ➡ 모든 프로그래밍 언어에서 발생하는 기본적인 문제

 

🤓 예제

int i;
float sum = 0.1;

for (i = 0; i < 1000; i++)
{
    sum += 0.1;  
}

printf("0.1을 1000번 더한 합계는 %f입니다.\n", sum);

✨ 실행결과

0.1을 1000번 더한 합계는 100.099045입니다

 

💥 100이여야 하는데 오차가 난 모습