C언어 unsigned 정수 자료형, 사용 이유
정수형은 보통 양수와 음수를 모두 저장하지만, 양수만을 저장하면 두 배 더 넓은 범위의 값을 저장할 수 있습니다. 따라서 음수가 없는 데이터를 저장할 때는 unsigned를 사용합니다.
unsigned 자료형을 사용할 때는 출력 시 변환 문자 사용에 주의해야 합니다. unsigned 변수에 큰 양수를 저장하고 %d로 출력하면 음수가 출력될 가능성이 있으며, 음수를 저장하고 %u로 출력하면 양수가 출력됩니다.
#include <stdio.h>
int main(void)
{
unsigned int a;
a = 4294967295;
printf("%d\n", a);
a = -1;
printf("%u\n", a);
return 0;
}
/*
<Run>
-1
4294967295
*/
실행결과를 보면 이상한데, 그 이유는 두 정수가 메모리에 저장되는 형태는 같으나 출력되는 방식이 다르기 때문입니다. %d는 부호까지 생각해서 10진수로 출력하는 변환 문자고, %u는 부호 없는 10진수로 출력하는 변환 문자입니다.
음수는 그 절댓값을 2의 보수로 저장하는데, 9행에서 지정한 -1을 표현하면 7행의 4294967295와 메모리 내에 저장된 형태가 11111111 11111111 11111111 11111111로 같습니다.
8행에서 %d 변환 문자를 사용했으므로 7행의 데이터 4294967295의 가장 왼쪽 비트를 부호 비트로 간주하므로 -1을 출력합니다. 그러나 %u를 사용하면 부호 비트를 고려하지 않고 모든 비트를 10진수로 바꿔 4294967295를 출력합니다.
결국 unsigned형 변수에 음수도 저장하고 출력할 수 있습니다. 그러나 연산하거나 대소를 비교할 때는 부호 비트를 고려하지 않고 항상 양수로 처리하므로 결과가 예상과 다를 수 있습니다. 따라서 unsigned 자료형은 항상 양수만 저장하고 %u로 출력하기를 권합니다.
'C언어' 카테고리의 다른 글
[C언어] 문자열 저장 (0) | 2021.05.13 |
---|---|
[C언어] 실수 자료형, double 을 사용하는 이유 (0) | 2021.05.12 |
[C언어] 정수 자료형 (0) | 2021.05.10 |
[C언어] 변수 선언 방법 (0) | 2021.05.09 |
[C언어] 실수 상수의 오차 (0) | 2021.05.08 |
댓글