정수 형식과 표현 범위 (char, short, int, long,…) [언제나 C언어]

안녕하세요. 언제나 휴일에 언휴예요.

이번 강의에서는 정수 형식과 표현 범위를 알아볼게요.

== 다루는 내용
1. 정수 형식의 종류
2. 정수 형식의 메모리 크기
3. 정수 형식의 표현 범위

정수 형식의 종류

C언어에서 제공하는 정수 형식은 다음처럼 여러 가지 정수 형식을 제공합니다.

char, short, int, long, long long

C언어에서 제공하는 정수 형식은 음수를 포함하지 않는 정수 형식도 제공합니다.

unsigned 키워드가 붙는 형식은 모두 음수를 포함하지 않는 정수 형식입니다.

unsigned char, unsigned short, unsigned int, unsigned long, …

형식을 unsigned 만 표현하면 unsigned int로 취급합니다.

정수 형식의 메모리 크기

이번에는 정수 형식의 메모리 크기를 알아봅시다.

먼저 문자 리터럴 표현과 정수 리터럴 표현의 크기를 알아볼게요.

리터럴은 소스 코드에서 고정된 값을 표현하는 것을 말합니다. 코드 상에 27, ‘a’, “Hello”처럼 표현하는 것을 리터럴 표현이라고 부릅니다.

크기를 확인할 때는 sizeof를 이용합니다.

int sizeof(표현)

#include //표준 라이브러리 헤더
#include //표준 입출력 헤더
int main()
{    
    printf("%d %d\n", sizeof('a'), sizeof(23));    
    system("pause");
    return 0;
}

실행 결과는 둘 다 4입니다. 이를 통해 문자 리터럴 표현도 int 형식 취급하는 것을 알 수 있어요.

4 4

unsigned 가 붙은 형식과 붙지 않은 형식의 메모리 크기는 같습니다. 정수 형식의 크기를 알아볼게요.

#include //표준 라이브러리 헤더
#include //표준 입출력 헤더
int main()
{    
    printf("%d %d\n", sizeof('a'), sizeof(23));    
    printf("char:%d\n", sizeof(char));
    printf("short:%d\n", sizeof(short));
    printf("int:%d\n", sizeof(int));
    printf("long:%d\n", sizeof(long));
    printf("long long:%d\n", sizeof(long long));
    system("pause");
    return 0;
}

실행 결과는 다음과 같습니다.

char:1
short:2
int:4
long:4
long long:8

gcc는 다음과 같습니다.

char:1
short:2
int:4
long:8
long long:8

정수 형식의 표현 범위

정수 형식의 첫 번째 비트는 부호 비트입니다. (unsigned 형식들은 부호 비트가 없습니다.)

1바이트인 char 형식에서 표현할 수 있는 제일 큰 수는 이진수로 0111 1111 입니다.

16진수로 0x7F입니다.

C언어의 정수 형식에서 부호 비트가 1일 때 나머지 비트를 2진 보수를 취한 값이 크기입니다.

이진수 1000 0000 을 예로 들게요.

부호 비트가 아닌 나머지 비트를 0은 1로 1은 0으로 바꾸는 것이 1진 보수입니다.

000 0000 => 111 1111 (10진수 127)

2진 보수는 1진 보수에 1을 더하면 구할 수 있어요. (크기가 128)

따라서 이진수 1000 0000은 -128입니다.

다음은 정수 형식의 표현 범위를 확인하는 코드입니다.

short 형식의 표현 범위를 확인하기 위해 명식적 형식 변환을 사용했어요.

명식적 형식 변환: (형식)표현

#include //표준 라이브러리 헤더
#include //표준 입출력 헤더
int main()
{    
    printf("%d %d\n", sizeof('a'), sizeof(23));    
    char c1 = 0x80, c2 = 0x7F;//1000 0000, 0111 1111
    printf("char:%d, %d ~ %d\n", sizeof(char),c1,c2);
    printf("short:%d, %d~%d\n", sizeof(short),(short)0x8000,0x7FFF);
    printf("int:%d,%d~%d\n", sizeof(int),0x80000000,0x7FFFFFFF);
    printf("long:%d\n", sizeof(long));
    printf("long long:%d, %lld~%lld\n", sizeof(long long),0x8000000000000000,0x7FFFFFFFFFFFFFFF);
    system("pause");
    return 0;
}

실행 결과는 다음과 같습니다.

4 4
char:1, -128 ~ 127
short:2, -32768~32767
int:4,-2147483648~2147483647
long:4
long long:8, -9223372036854775808~9223372036854775807