C

정수와 실수의 표현 방식에 대하여!

오군_ 2023. 5. 9. 09:58
반응형
데이터 표현 방식

컴퓨터가 데이터를 표현하는 방식은 대표적으로 2진수(Binary)이며,

우리가 평소에 사용하는 것은 10진수(Decimal)입니다.

 

데이터 표현방식이 다를뿐 결국 같은 데이터입니다!

 

2진수(Binary) : 두 개의 기호를 이용해서 값(데이터)를 표현하는 방식

10진수(Decimal) : 열 개의 기호를 이용해서 값(데이터)를 표현하는 방식

N진수 : N 개의 기호를 이용해서 값(데이터) 을 표현하는 방식

 

2진수와 호환되는 8진수 16진수 또한 많이 사용됩니다.

8진수와 16진수는 일반인들이 볼때 매우 생소한 방식입니다.

그런데도 이것을 쓰는 이유가 있습니다.

 

8진수와 16진수는 컴퓨터가 사용하는 2진수에 호환됩니다.

2의 10승을 표현하려면 10비트가 필요한데 너무 길기에

프로그래머가 메모리를 살펴볼때 가독성이 떨어집니다.

그래서 이와 호환되는 8진수나 16진수를 사용하기도 합니다.

16진수는 자주 나옵니다.

 

 

 

진수별 표현법
  • 2진수 : 2진수는 0,1로 표현됩니다. 컴퓨터는 2진수로 이루어진 숫자를 이해할 수 있습니다. 
  • 10진수 : 10진수는 0~9로 표현됩니다. 사람들이 이해하기 가장 쉽고 주로 사용하는 숫자표현법입니다.
  • 8진수 : 8진수는 0~7로 표현됩니다.
  • 16진수 : 16진수는 0~9, A~E 로 표현됩니다.

 

 

 

데이터 표현단위 바이트

컴퓨터 메모리의 주소 값은 1바이트당 하나의 주소가 할당됩니다.

컴퓨터에 있어 바이트는 의미있는 단위입니다.

 

 

 

8진수 & 16진수 데이터 표현방법

 

 

 

정수 표현방식

가장 왼쪽 비트는 MSB(Most Significant Bit) 부호라고 부르며 음수나 양수, 부호를 나타내는 비트입니다.

이를 제외한 나머지 비트는 데이터의 크기를 나타내는데 사용합니다.

 

최상위비트와 관련된 유명한 일화로. 문명게임에서 간디의 폭력성 버그가 있습니다.

byte크기의 데이터로 예시를 들어보겠습니다. byte의 데이터 크기의 범위는 0~255입니다.

만약 0에서 -1을 하면 어떻게 될까요? 바로 가장 큰 값인 255가 됩니다.

이것을 언더플로우라고 합니다. 간디의 호전성이 0에서 수치를 하락시키니 호전성이 MAX가

되어버리는 버그로 유명했습니다.

참고로 오버플로우는 이와 반대인 255에서 +1을 해서 0이 되는 현상을 뜻합니다!

 

 

 

음의 정수 표현방식

정수를 음수로 표현한다면 '부호비트인 최상위 비트에 1을 올리면 되는건 아닐까?'

라고 생각할 수 있지만, 이것은 정답이 아닙니다! 밑의 그림을 예시로 들어보겠습니다.

+5와 -5를 더하면 0이 될거 같지만 실제로는 0이 되지 않았습니다

'부호비트인 최상위 비트에 1을 올리면 되는건 아닐까?'라는 가정은 틀린것입니다.

그렇다면 정수를 음수로 표현하는 방식은 어떻게 하는 것일까요?

바로 2의 보수로 음의 정수가 표현이 가능합니다.

2의 보수란 음의 정수로 표현하는 수의 비트를 모두 반전시킵니다!

0비트를 1로 1비트를 0으로 말입니다.

이렇게 반전시킨 수에 1을 더하면 그것이 2의 보수입니다

2의 보수를 통한 음의 정수 구하는법

이렇게 2의보수를 취해서 구한 음의 정수와 양의 정수를 더하면 0이 나옵니다!

더할때 범위를 벗어나는 올림수는 버려집니다 이렇게 0이 나오게 되므로 2의보수를 통한

음의 정수 표현 방식이 옳다는게 증명됩니다!

 

참고로 2의 보수로 음의 정수로 표현한 것을 다시 2의 보수를 취하면

원래의 정수가 나오게 됩니다.

 

 

 

실수 표현 방식

0과 1사이의 실수는 무한합니다.

모든 세상의 메모리를 끌어다 써도 마자르다.

그래서 메모리를 위해 정확도를 다소 포기하게 됩니다.

 

최상위비트는 역시 부호 비트로 사용됩니다.

 

밑에 그림처럼 e에 의해서 소수점의 위치가 정해지고

m에 의해서 소수의 길이가 정해집니다.

 

 

 

실수 오차 확인

아래의 코드를 실행하면 이론상으로는 10이 딱 나와야 합니다 하지만

결과 값은 10.000002가 출력이 됩니다.

 

실수는 무한하기에 정확하게 표현이 불가능 합니다. 즉 실수 표현에 있어서의 오차 발생은

C언어의 특성이 아닌 컴퓨터의 기본적인 특성입니다.

 

이미지 출처 : 윤성우의 열혈 C 프로그래밍

 

반응형

 

반응형