WinCNT

C언어 - 데이터 타입(자료형)과 변수 본문

게임 프로그래밍(학습 내용 정리)/C

C언어 - 데이터 타입(자료형)과 변수

WinCNT_SSS 2021. 10. 6. 15:52

1. 기억 단위

기억 단위란?

  • 데이터 타입별 저장 가능한 단위를 의미합니다.

Data란?

  • 컴퓨터가 처리할 수 있는 문자, 숫자, 소리, 그림 등의 형태로 된 자료입니다.
    자료(data)를 가공해 얻는 것이 정보(information)입니다.

비트(Bit)란?

  • Binary Digit를 줄인 말입니다.
  • 데이터(자료)들을 나타내는 최소 단위로, 0과 1의 값을 갖습니다.

바이트(Byte)란?

  • 컴퓨터가 조작하는 정보의 최소 처리 단위입니다.
  • 현대의 대부분의 컴퓨터에는 8bit를 1byte로 삼습니다.

니블(nibble)이란?

  • 1byte의 절반, 4bit를 가리키는 컴퓨터 용어입니다.
  • 4bit는 16까지의 값을 가지므로 하나의 니블은 16진수와 일치합니다.

2. 데이터 저장 방식

컴퓨터는 0과 1로 이루어진 기계어만 판독할 수 있으므로 데이터 또한 0과 1로 저장할 필요가 있습니다.

정수의 경우는 2진법을 이용해 0과 1로 변환합니다.

 

예를 들어 251,654,913이란 정수를 4바이트 Int(Integer)형의 데이터로 변환하변 다음과 같습니다.

  • 10진수로 저장할 경우 : 251,654,913
  • 2진수로 저장할 경우 : 0000 1110 1111 1111 1111 0011 0000 0001
  • 16진수로 저장할 경우 : 0x0EFFF301
    ※0x는 16진수라는 의미

3. 메모리 상의 저장 방식

비트 오더란?

  • 컴퓨터에 비트를 저장하는 순서입니다.
  • 컴퓨터의 최소 처리 단위가 byte이기 때문에 보통은 순서대로 저장합니다.

바이트 오더란?

  • 컴퓨터에 바이트를 저장하는 순서입니다.
  • 컴퓨터의 최소 처리 단위가 byte이기 때문에 여러 방식이 존재합니다.
  • 크게는 빅 엔디안 방식리틀 엔디안 방식이 존재합니다.
    ※바이 엔디안, 미들 엔디안 등등도 존재합니다!

 

엔디안 방식의 종류

  • 빅 엔디안 방식(Big-Endian Fromat)
    • 정보의 최상위 바이트가 가장 낮은 주소에 위치합니다.
      (즉, 보통 숫자를 쓰는 방식대로 낮은 주소부터 Byte단위로 순서대로 기록합니다)
    • RISC기반의 컴퓨터, 모토로라 마이크프로세서 등에서 채택하고 있습니다.
    • 예시) 0x12345678를 저장할 경우
      주소 0x01 0x02 0x03 0x04
      12 34 56 78
  • 리틀 엔디안 방식(Little-Endian Format)
    • 정보의 최상위 바이트가 가장 높은 주소에 위치합니다.
      (낮은 주소부터 Byte 단위로 역순으로 기록합니다)
    • 인텔 프로세서, DEC의 알파 프로세서 등에서 채택하고 있습니다.
    • 예시) 0x12345678를 저장할 경우
      주소 0x01 0x02 0x03 0x04
      78 56 34 12

 

빅 엔디안 방식(Big-Endian Fromat) V.S 리틀 엔디안 방식(Little-Endian Format)

1. 수학적 연산 : 리틀 엔디안 방식이 유리

리틀 엔디안은 우리가 계산하는 것처럼 뒤에서부터 계산합니다.
그래서 Carry가 발생할 때 처리가 수월해서 리틀 엔디안이 수학적 연산에서 유리합니다

2. 타입형 변환 : 리틀 엔디안 방식이 유리

리틀 엔디안 방식은 타입의 시작 주소에 값이 들어가지만 빅 엔디안 방식은 뒷부분에 저장되므로
리틀 엔디안 방식이 형 변환 속도가 더 빠릅니다.

3. 숫자 비교 : 빅 엔디안 방식이 유리

수치를 앞에서부터 차례차례 비교할 수 있는 빅 엔디안 방식이 더 빠릅니다.

4. 디버깅 : 빅 엔디안 방식이 유리

빅 엔디안은 사람이 읽는 순서와 동일하게 저장되므로 빅 엔디안 방식이 디버깅 하기 편합니다.

 

엔디안 방식은 네트워크에서 더욱 중요해집니다.

데이터를 주고 받는 컴퓨터 사이에서 엔디안 방식을 고려하지 않으면
전송한 데이터와 전송받은 데이터가 전혀 다른 사고가 발생하기 때문입니다.

따라서 네트워크 상에서 데이터를 전송/수신할 때는 네트워크 바이트 오더를 따라야 한다는 규칙이 정해졌습니다.

참고로 네트워크 바이더 오더에서는 빅 엔디안이 가장 흔한 포맷입니다.

4. Data Type

C언어에는 정수, 부동(수소)형, 문자형, void형, enum형 등의 기본형 데이터 타입이 존재합니다.

기본형 데이터 타입은 많지 않으며, 자세한 Spec은 MSDN의 C Type Specifiers를 참조하는 것이 가장 좋습니다.

 

정수형(Int)

  • 수학에서의 정수(Interger)를 표현하기 위한 데이터 타입입니다.
자료형 바이트수 범위
int 4 -2147438648 ~ 2147438647
unsigned int 4 0 ~ 4294967259
short int 2 -32768 ~ 32767
unsigned short int 2 0 ~ 65535
long 4 -2147438648 ~ 2147438647
unsigned long 4 0 ~ 4294967259

 

부동 소수점 형(floating point)

  • 수학에서의 부동소수점 수를 표현하기 위한 데이터 타입입니다.
    ※부동은 不動(움직이지 않음)이 아니라, 浮動(떠서 움직임)이란 한자를 씁니다.
자료형 바이트수 범위
float 4 3.4e-38 ~ 3.4e+38 ( 유효자릿수 : 소수점 미만 7자리 )
double 8 1.7e-308 ~ 1.7e+308 ( 유효자릿수 : 소수점 미만 15자리 )

 

문자형

  • 문자를 표현하기 위해서 사용됩니다.
  • 값 자체는 정수와 같은 형태로 저장됩니다.
    따라서 char라는 자료형에 'A'를 대입할 경우, 아스키 코드에 따라 값은 65가 저장됩니다.
자료형 바이트수 범위
char 1 -128 ~ 127
unsigned char 1 0 ~ 255

 

Void형

  • void는 아무 것도 없음을 뜻합니다.
  • 함수의 리턴 값, void* 형태로 쓰입니다.

 

열거형(enumerated type)

  • 상태 등을 표현할 때, 정수 대신 태깅 등의 용도로 사용됩니다.
  • 사실상 정수와 같이 취급이라 보면 됩니다.

5. 변수의 선언, 정의

변수(Variable)란?

  • 프로그램이 실행되는 동안 그 값이 변경될 수 있는 기억 장소를 의미합니다.

변수의 선언(Declaration)과 정의(Definition)란?

  • 변수의 선언(Declaration)
    • 변수를 어떤 방법으로 사용할 것인지 컴퓨터(컴파일러)에게 선언하는, 즉 알려주는 과정입니다.
    • 실제로 메모리가 할당되지는 않습니다.
  • 변수의 정의(Definition)
    • 컴퓨터(컴파일러)에게 실제 변수를 생성하도록 하는 것을 의미합니다.
    • 실제로 메모리가 할당됩니다.
  • 다음과 같은 방법으로 변수를 선언과 정의를 할 수 있습니다.
    int a;
    a = 0;
    
    int b = 1;​
    float fValue = 1.0f;

 

참고 사이트

https://jhnyang.tistory.com/172

https://jhnyang.tistory.com/226

https://zetawiki.com/wiki/C%EC%96%B8%EC%96%B4_%EC%84%A0%EC%96%B8%EA%B3%BC_%EC%A0%95%EC%9D%98_%EC%B0%A8%EC%9D%B4%EC%A0%90