본문 바로가기
IT/C언어

01 - 데이터 자료형에 대해서 알아보자 ( 양수, 음수, 1의 보수 )

by BeeWhy 2021. 6. 20.

 

 C언어에서 자료형에 대해서 알아봅시다.

 C언어의 자료형은 아래와 같은 종류들이 있습니다.

 보시면 여러가지가 있고 범위도 다양하게 있어서 이걸 전부다 외워야 된다고 생각하시면 안됩니다.

 

 주로 많이 사용하는 char, int의 크기가 몇 byte인것만 알고 가시면 되겠습니다~!

정수의 범위는 어떻게 주어지는 걸까요?

 

unsigned char형의 예시를 들어보겠습니다. 

unsigned char형은 char에서 음수가 존재하지 않는 자료형입니다. 

아래 그림은 bit 단위로 표시한 내용입니다.

1 bytes = 8 bit 입니다. 그래서 1byte를 아래와 같이 0번부터 7번까지 총 8개의 bit로 표시한 내용입니다.

bit는 1 또는 0 밖에 표시할 수 없는 상태 입니다. 즉 unsigned char형의 가장 큰 값은

2진수 1111 1111 입니다.

 

각각의 비트는 2^7~ 2^0을 표시합니다. 결국 2진수 1111 1111 = 10진수 255가 됩니다.

즉 unsigned char형은 0~255까지 표시가 가능합니다.

 

그렇다면,

char형은 어떻게 다를까요?

최상위 비트인 7번 비트가 부호를 나타내는 비트가 됩니다.

최상위 비트 7번이 1이면 마이너스를 뜻합니다.

 

char형에서 가장 큰 수는 위와 같습니다.

0~6번 비트까지 1인 0111 1111 입니다. = 10진수로 128이 됩니다.

 

그러면 최상위 비트 7번이 부호를 나타낸다고 했으니, 가장 작은 -128은 1111 1111이 되는 걸까요?

정답은...

아닙니다.

 

최상위 비트가 1인 음수를 확인하는 과정은 위와 같습니다.

첫번째로 최상위 비트가 1이라면, 모든 비트를 뒤집어 줍니다.

만약 값이 0이라면 → 1으로,  1이라면 → 0으로 바꿔줍니다.

 

두번째로 +1을 해줍니다.

그러면 그 결과 값에 -를 붙여주면 결과값이 됩니다.

즉 char형의 1111 1111(2) 의 경우는 -1이라는 결과가 됩니다.

이렇게 변환하는 과정을 "1의 보수" 라고 합니다.

 

이렇게 복잡하게 변환하게 된 이유는 연산을 해보면 알 수 있습니다.

-1 + 1 = 0이 되지요?

이걸 2진수로 표시해보시면,

1111 1111(2) + 0000 0001(2) = 0000 0000(2) 가 됩니다.

7번 비트 위에 8번 비트는 무시하시면 됩니다. char형이 담을 수 있는 범위가 아니니깐요.

 

그러면 가장 작은 -128을 2진수로 표시한 내용은 어떻게 될까요?

128을 "1의 보수"에 적용을 하시면 -128이 됩니다.

 

확인 해보실까요?

우선 +128에서 부터 시작하시면 됩니다.

+128 = 0111 1111(2)

0,1을 뒤집으면 = 1000 0000(2)

+1을 해주면 = 1000 0001(2) 가 됩니다.

즉 -128 = 1000 0001(2) 가 됩니다.

 

-128의 1의 보수는 128이 나오는지 다시 확인을 해보죠.

위와 값이 1의 보수 마지막 결과가 0111 1111(2)가 나오는 것을 확인하실 수 있습니다.

여기까지 정수 부분 확인하는 과정을 알아봤습니다.

 

마지막 남은 실수는 표시하는 방법이 좀더 복잡하긴 합니다. 부동소수점 규약을 참고하시면 되는데... 솔직히 이 부분까진 알 필요는 없다고 생각합니다.

(사실 저도 1~2번 들어본 적은 있으나, 암기는 안하고 있습니다. 정보처리기사 시험때 확인해본 기억이 있네요.)

임베디드 개발자라면 더더욱 그렇습니다.

임베디드 개발환경에서는 실수, float, double형이 지원되지 않는 경우가 대부분이거든요.

 

C언어 코딩은 한 줄도 없었지만, 여기 내용은 개발자라면 기본적으로 숙지는 해두고 시작하셔야 됩니다. 생각보다 데이터 크기에 대해서 고려 없이 했다가 의도와 다르게 동작하는 경우가 종종 있거든요.

댓글