본문 바로가기
C언어

[C언어] unsigned 정수 자료형, 사용 이유

by 에파 2021. 5. 11.
728x90

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

댓글