본문 바로가기
프로그래밍언어/C언어

자료형이란 무엇인가 - unsigned 자료형

by J코딩 2021. 10. 15.
반응형
정수형의 양수 표현 범위를 두배로 늘리는 unsigned 자료형이 있다

정수형 자료형들인 char, short, int, long은 키워드 signed나 unsigned를 붙여서 사용할 수 있습니다. 키워드 signed는 생략이 가능하므로 다음은 동일한 표현입니다.

int a;
signed int a;

대부분의 프로그래머는 키워드 signed를 생략합니다. 그렇다면, 키워드 unsigned의 의미는 무엇일까요? 사전적인 의미는 '부호가 없는'으로 양수를 의미합니다. 정리하면,

  • signed - 양수, 0, 음수를 모두 표현
  • unsigned - 0과 양수만을 표현(음수는 표현하지 않습니다.

다음 표는 키워 unsiged가 적용된 데이터 표현 범위를 보여주고 있습니다. 특이한 점은 키워드 signed에 비해 굵은 숫자들이 뒤에 합산되어서 양수 부분이 두배라는 점입니다.

정수형 메모리 크기 데이터 표현 범위
char(signed char)
unsigned char
1바이트(8비트)
1바이트(8비트)
-128 ~ +127
0 ~ (127+128)
short(signed short)
unsigned short
2바이트(16비트)
2바이트(16비트)
-32768 ~ +32767
0 ~ (32767+32768)
int(signed int)
unsigned int
4바이트(32비트)
4바이트(32비트)
-2147483648 ~ +2147483647
0 ~ (2147483647+2147483648)
long(signed long)
unsigned long
4바이트(32비트)
4바이트(32비트)
-2147483648 ~ +2147483647
0 ~ (2147483647+2147483648)

그런데 왜 키워드 unsigned가 필요한가요? 다음 예제를 가지고 생각해 보겠습니다.

5행에서 signed char는 char와 같은 의미로 키워드 signed를 생략할 수 있습니다. 1바이트 메모리 크기를 가지며, 최소값 -128 ~ 최대값 127까지 지정할 수 있습니다. 그런데 여기에 130을 저장해서 최대값을 넘어 오버플로우가 생겼습니다.

 

8행에서 unsigned char는 1바이트 메모리 크기를 가지며, 최소값 0 ~ 최대값 255까지 저장할 수 있습니다. 똑같이 130을 저장하고 있지만 unsigned형이므로 데이터 표현 범위 내에 있습니다.

 

이제 저장돈 값을 출력해 보겠습니다.

 

10행에서 변수 num1을 출력합니다. 그런데 결과를 살펴보니 -126이 출력됩니다. 의미 없는 값이라고 생각할 수 있지만, 나름대로 의미가 있습니다. 이것은 오버플로우와 언더플로우에서 설명하도록 하겠습니다.

 

12행에서 변수 num2를 출력합니다. 결과를 살펴보니 130이 정상적으로 출력됩니다. 주의할 점은 unsigned형을 출력할 때는 %u를 사용합니다. %u는 부호가 없는 정수를 표현하는 출력 서식입니다.

 

정수형의 데이터 표현 범위를 외우지 않아도 시스템 라이브러리 limits.h가 최소값과 최대값 상수를 지원했었습니다.

 

키워드 unsigned가 적용된 데이터 표현 범위에 대해서도 똑같이 시스템 라이브러리 limits.h가 제공합니다. 다음 예제를 확인해 봅시다.

https://jcoding7.tistory.com/entry/%EC%9E%90%EB%A3%8C%ED%98%95%EC%9D%B4%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80-%EC%8B%9C%EC%8A%A4%ED%85%9C-%EB%9D%BC%EC%9D%B4%EB%B8%8C%EB%9F%AC%EB%A6%AC?category=1000023 

 

자료형이란 무엇인가 - 시스템 라이브러리

정수형 데이터 표현 범위를 나타내는 시스템 라이브러리가 있다. 데이터 표현 범위를 외워야 하는지 아니면 제시한 표현 공식으로 구해야 하는지 판단이 서지 않습니다. 당연히 둘 다 쉽지가 않

jcoding7.tistory.com

다음 표는 헤더 파일 limits.h에서 제공하는 unsigned 정수형의 상수들을 정리한 것입니다.

unsigned 정수형 상수(최대값)
unsigned char UCHAR_MAX
unsigned short USHRT_MAX
unsigned int UINT_MAX
unsigned long ULONG_MAX

unsigned char의 최대값을 구해 주는 상수 UCHAR_MAX, unsigned short의 최대값을 구해주는 상수 USHRT_MAX, unsigned int의 최대값을 구해주는 상수 UINT_MAX, unsigned long의 최대값을 구해주는 상수 ULONG_MAX를 각각 출력합니다.

반응형

댓글