본문 바로가기

Learn & Develop/C

C언어 - 기본 자료형의 종류와 수의 표현방식

0. 변수와 자료형

 

 변수

  데이터의 저장을 위해서 할당된 메모리 공간에 붙여진 이름.

 

 자료형

  데이터를 표현하는 방법.

  쉽게 말해 '변수에 넣을 값이 어떤 형식을 가지고 있고, 공간은 얼마나 필요한가?'를 나타내주는 것이다.

 

 

1. 기본 자료형의 종류

 자료형은 크게 '정수형'과 '실수형'으로 나뉜다.

자료형 크기
정수형 char 1Byte
short 2Byte
int 4Byte
long 4Byte
long long 8Byte
실수형 float 4Byte
double 8Byte
long double 8Byte 이상

 Q : 왜 이렇게 자료형이 다양한가?

 A : (1) 데이터의 표현방식이 다르므로 최소 둘 이상의 자료형이 필요하다.

          #컴퓨터가 *정수와 실수를 표현하는 방식이 다르기 때문에 기본적으로 둘 이상의 자료형 종류가 필요하다.

    : (2) 메모리 공간의 효율적인 사용을 위해서이다.

          #값을 저장하는 데에 있어 필요이상으로 메모리 할당량을 크게 잡는다면, 낭비되는 메모리가 생기기 때문이다.

          #예를 들어 정수 1을 저장하는데 short형이면 충분한 Byte를 int형으로 저장하면

            두 배에 해당되는 Byte가 소모된다.

 

 

2. 수의 표현방식

 앞에서 보았듯이 정수와 실수를 표현하는 방식은 다르다.

 

 (0) 정수의 표현

  1Byte 메모리 공간에 1이라는 정수를 저장한다면, 메모리 공간에는 이렇게 저장된다.

00000001 (= 1)

  여기서, 정수를 표현하는 데 있어 가장 왼쪽에 존재하는 Bit는 부호를 표현하는데 사용된다.

  0이면 양수, 1이면 음수를 표현하는데, 이 비트를 가리켜 MSB(Most Significant Bit)라고 한다.

  나머지 Bit들은 데이터의 크기를 나타낸다.

 

  하지만 MSB만 1로 바뀐다고 해서 음수가 되는 것은 아니다.

  

  00000010 (= +2)

  10000010 (= -2라고 생각하는 것)

  10000100 (??)

 

  둘 값을 더했을 때 0이 나오지 않는다.

  그럼 음수는 어떻게 표현하는가?

 

  00000010 (= +2)

  여기서 1의 보수를 취해주고

  11111101

  추가로 1을 더해주면

  11111110 (= -2)

 

  이렇게 하면 -2가 되고, 두 값을 더했을 때 0이 나온다.

  이 방법을 ' 2의 보수법 ' 이라 한다.

 

 

 (1) 실수의 표현

  2Byte 메모리 공간을 1Byte씩 반으로 나눠 각각 소수점 이상, 소수점 이하를 표현한다면, 대충 이렇게 저장된다.

00000101 00001001

  하지만 이렇게 실수를 표현한다면, 복잡한 실수를 표현할 때는 많은 Byte를 소모하여 표현하게 된다.

  결국 적은 비트의 수를 가지고 넓은 범위의 실수를 표현하기 위해 하나의 식을 정의.

 

  왼쪽에 있는 소수점 이상의 수를 e라 하고, 오른쪽에 있는 소수점 이하의 수를 m이라 하자.

실수의 표현을 위해 정의된 수식 : ±(1.m) * 2 ^ (e-127)

  이러한 식을 이용하면 적은 비트 수를 가지고도 보다 넓은 범위의 실수를 표현할 수 있다.

  하지만 표현하고자 하는 실수의 값을 정확하게 표현하는 것이 아닌, '근사치'를 통해 실수를 표현하는 것.

 

  따라서 표현방식으로 인해 실수의 표현에는 오차가 따르며, 이러한 오차를 가리켜 ' 부동 소수점 오차 ' 라고 부른다.

 

// 예제 1
#include <stdio.h>
int main(void) {
    float num = 0.0;
    float result = 0.0;

    for (int i = 0; i < 100; i++) {
        result = num + 0.1; // num + 0.1 값을 result안에 넣고 다시 num안에 넣어줌
        num = result;
    }
    
    printf("%f\n", result);
    return 0;
}

//실행 결과

10.000002

  0.1을 100번 더하면 10.0이 나와야 하지만 다른 값이 나왔다.

 

 (3) signed와 unsigned

  정수 자료형의 이름에 한해서 unsigned 선언을 추가할 경우, MSB도 데이터의 크기를 표현하는데 사용이 된다.

  따라서 ,표현할 수 있는 값이 0이상의 범위로 두배가 된다.

// 예제 2
#include <stdio.h>
int main(void) {
	signed char num1 = 127; // signed <자료형> = <자료형>
	printf("처음 num1의 값: %d\n", num1); // 01111111 : 127
	num1 = num1 << 1;
	printf("Bit이동을 한 칸 이동한 num1의 값: %d\n", num1); // 11111110 -2

	unsigned char num2 = 127;
	printf("처음 num2의 값: %d\n", num2); // 01111111 : 127
	num2 = num2 << 1;
	printf("Unsigned 선언을 한 후 Bit이동을 한 칸 이동한 num2의 값: %d\n", num2); // 11111110 : 254

	return 0;
}

  예제에서 사용된 char 자료형은 값을 -128이상 127이하로 표현할 수 있다.

  하지만 unsigned 선언을 할 경우 MSB가 사라지므로, 0이상 255이하로 표현이 가능하다.

 

  signed선언같은 경우는 예제에서도 나와있듯이 ' signed <자료형> = <자료형> ' 이다.

  즉, 우리가 쓰는 자료형들은 모두 signed 선언이 생략된 채로 사용되고 있는 것.

 

 

 

오타, 지적 환영합니다.

 

'Learn & Develop > C' 카테고리의 다른 글

C언어 - 반복문 while, do~while, for  (0) 2021.09.04
C언어 - 상수의 종류와 자료형의 변환  (0) 2021.09.03
C언어 - 연산자(2)  (0) 2021.09.03
C언어 - 연산자(1)  (0) 2021.09.02
C언어 - 2진수와 16진수  (0) 2021.09.02