Home C언어 (3) 자료형
Post
Cancel

C언어 (3) 자료형

C언어 (3) 자료형

변수를 선언할 때 어떤 자료형을 받을지 앞에 적어줘야 한다. 자료형이란 뭘까?
이 자료형에 따라 메모리에 어떻게 값이 저장되는지 자세히 알아보자.

자료형

데이터는 정수형, 실수형, 문자형과 같이 다양한 type을 가진다. 이 type이 자료형이다.
나누는 기준은 변수 앞에 붙여진 int, double 등의 키워드를 보고 판단한다.

자료형키워드바이트 수범위
정수형short2-32,768 ~ 32,767
정수형int4-2,147,483,648 ~ 2,147,483,647
정수형long4 또는 8-2,147,483,648 ~ 2,147,483,647 4와 8은 os에 따라 다름.
정수형long long8-9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807
부호 없는 정수형unsigned short20 ~ 65,535
부호 없는 정수형unsigned int40 ~ 4,294,967,295
부호 없는 정수형unsigned long4 또는 80 ~ 4,294,967,295 4와 8은 os에 따라 다름.
부호 없는 정수형unsigned long long80 ~ 18,446,744,073,709,551,615
실수형float4약 ±3.4E-38 ~ ±3.4E+38
실수형double8약 ±1.7E-308 ~ ±1.7E+308
문자형char1-128 ~ 127
부호 없는 문자형unsigned char10 ~ 255
논리형bool1true(1) 또는 false(0)

이렇게 keyword와 그에 따른 할당 크기, 표현 숫자 범위가 정해져 있다.

다양한 자료형을 사용하는 이유

어째서 자료형이 여러 개가 있는 것일까? 하는 의문이 들 수 있다.

간단히 생각하면 물건을 담을 상자가 필요한데 물건의 크기에 따라 상자를 조절하는 것이 비용적으로나
시간적으로 효율적이기 때문이다. 변수에 값을 넣을때도 크기가 천차만별이기에 필요에 따라 사용한다.

sizeof 연산자

저 각각의 자료형에 따른 byte수를 보기 위해 사용할 수 있는 sizeof라는 함수가 있다.

1
2
3
4
5
6
7
#include <stdio.h>
int main() {
    int a;
    double b;
    printf("%d %d", sizeof(int), sizeof(b));
    return 0;
}

sizeof(자료형)을 사용하면 해당 자료형의 바이트 수가 나오고, sizeof(변수)는 변수의 자료형의 바이트 수가 출력된다.

범위에 대해서도 볼 수 있는 방법이 있는데에 정보가 있다.

1
2
3
4
5
6
7
8
#include <stdio.h>
#include <limits.h>
int main() {
    int a;
    double b;
    printf("%d %d", INT_MIN, INT_MAX);
    return 0;
}

limits.h를 헤더에 포함해주고 이렇게 자료형_MAX, 자료형_MIN을 통해 값을 볼 수 있다.

실수형 변수는 float.h의 FLT_MIN, FLT_MAX, DBL_MIN, DBL_MAX로 볼 수 있다.

진법

각각의 keyword를 보기 전에 진법에 대해서 제대로 아는 것이 좋다.
우리가 쓰는 10진법에서 768은 왜 768일까? 하나씩 뜯어보면 (7x10^2)+(6x10^1)+(8x10^0)이다.
이렇게 768 = 700 + 60 + 8이 되는 것이다.
그렇다면 12진법에서 768은 10진법으로 어떻게 바뀌냐면 (7x12^2)+(6x12^1)+(8x12^0) = 1088이 된다.
n진법인 숫자인 abcd가 있으면 d가 n^0의 자리수, c가 n^1의 자리수, b가 n^2의 자리수, a가 n^3의 자리수
서로를 곱한 다음 더하면 된다.
image

진법 변환 문제

관련된 백준 문제를 풀어보면 이해에 도움이 될 것이다.

이 진법 이야기를 한 이유는 컴퓨터는 전기 신호로 on(0), off(1) 두 숫자만 표현이 가능하다.
만약 13이라는 10진법 숫자를 2진법으로 하면 13=(1x2^3)+(1x2^2)+(0x2^1)+(1x2^0)이므로 1101이 된다.
이 1이나 0을 표현하기 위해 컴퓨터의 메모리 소자가 사용되고 이진수 한 자리를 bit라고 부른다.
그리고 8bit를 묶어 byte라고 쓰는데 1byte는 00000000~11111111을 표현할 수 있고 이는 0~255이다.
즉 1byte = 8bit가 표현할 수 있는 수는 0~255인 것이다.

이제 keyword 이야기로 돌아가면 자료형은 크게 정수형과 실수형이 있다.
문자형과 논리형도 크게 보면 정수형이라고 볼 수 있기 때문이다.
논리형은 0과 1만을 가지고, 정수형인 char에 입력하는 a와 같은 문자는 ASCII코드에 의해 숫자로 변환된다.

ASCII 코드

image

ASCII (American Standard Code for Information Interchange, 미국 정보 교환 표준 부호)라는 것이 있다.
8비트 컴퓨터에서 활용되어 문자를 숫자로 바꾸며 0부터 127까지 사용을 한다.
우리가 char같은 문자형 변수에 ‘a’를 입력하면 ASCII에 의해 97로 바뀌고 저장이 되는 것이다.

1
2
3
4
5
6
#include <stdio.h>
int main() {
    char a = 'a';
    printf("%d", a);
    return 0;
}

를 실행해보면 char형 변수도 정수 값으로 나옴을 알 수 있다. 그렇기에 char도 정수형이라고 할 수 있다.

정수형 변수

우선 정수형은 1, 3, 123 등의 정수를 저장하고 short, int, long long 등이 있다.
각각 표현하는 숫자의 범위를 보면 short는 2byte = 16bit, 표현 범위는 -2^15~2^15-1이다.
어째서 0~2^16-1을 표현하는 것이 아닐까? 그 이유는 최상위 비트는 등호 판별을 위해 사용되기 때문이다.
image

그림처럼 8bit에 값이 저장된다고 하면 가장 왼쪽에 있는 것을 최상위 비트라고 부른다.
저 최상위 비트가 0이면 양수, 1이면 음수로 생각하기에 숫자를 표현하는 비트는 8-1=7bit가 되는 것이다.
그러면 int는 4byte = 32bit니까 -2^31~2^31-1의 범위를 표현하고 이는 최대 21억 정도가 된다.

자료형 중 unsigned int라는 것이 있는데 범위를 보면 음수가 사라지고 양수 부분이 2배가 되었다.
위의 그림에서 최상위 비트를 숫자를 표현하는데 사용한다면 딱 이 범위가 되는 것을 알 수 있다.

오버플로우

scanf 할 때 잠깐 언급했었는데 overflow란 주어진 범위를 넘는 것을 의미한다.
int 범위는 -2,147,483,648 ~ 2,147,483,647라고 했는데, 이보다 작은 값이나 큰 값을 넣으면 어떨까?

1
2
3
4
5
6
#include <stdio.h>
#include <limits.h>
int main() {
    printf("%d %d", INT_MAX, INT_MAX+1);
    return 0;
}

2147483647 -2147483648 라는 결과가 나올 것이다. 어째서 가장 작은 값으로 돌아간 것일까?
이는 컴퓨터에서 음수를 표현하는 방법을 알아야 하기에 연산자를 공부하며 원리를 다시 볼 것이다.
지금은 가장 큰 곳에서 작은 곳으로, 작은 곳에서 큰 곳으로 순환하듯 넘어간다고 생각하자.

int를 선호?

이렇게 많은 정수형 자료형 중 어떤 것을 사용하는 것이 좋을까?
우리가 사용하는 CPU는 32비트나 64비트 구조이므로 4byte=32bit의 크기인 int가 가장 자연스럽게
처리할 수 있는 크기이다. 또한 long은 시스템에 따라 크기와 범위가 바뀌어 호환성도 좋지 않다.

또한 21억 정도면 대부분의 상황에 맞는 적절한 크기이기에 더 늘리거나 줄일 필요도 없다.
게다가 많은 함수들이 int로 지원하기에 앞으로 정수를 받을 때 int를 대부분 사용하게 될 것이다.
정말 큰 수가 필요할 때만 long long을 가끔 사용해준다.

자료형마다 입출력 형식도 달라지는데 short는 %hi, int는 %d, long은 %ld, long long은 %lld이다.


정수 자료형에 대한 내용이 꽤 길어져서 double과 같은 실수형 변수는 다음 글에서 보자.

This post is written by PRO.