신입 게임 개발자의 프로그래밍 일기

[C++ 입문자에서 벗어나기]Chapter_1: 타입(Type)#1 본문

Language/C++

[C++ 입문자에서 벗어나기]Chapter_1: 타입(Type)#1

KFGD 2017. 10. 17. 16:54

[C++ 입문자에서 벗어나기]Chapter_1: 타입(Type)#1


C++ 기본 문법을 숙지한 사람들이라면 아래 코드를 쉽게 알 수 있을 것입니다.


int num = 0;    //num이라는 4바이트 정수형 변수에 0을 저장하라.


이번 포스팅에서는 단순한 이 한 줄의 코드가 컴퓨터 상에서 어떻게 처리되는 지를 보다 자세히 살펴볼 것 입니다.



[디지털화]


컴퓨터는 0과 1 즉, 비트 집합만을 이해할 수 있습니다.

컴퓨터에게 명령을 내려야 하는 프로그래머들은 자신들이 표현 혹은 처리하고자 하는 사물들의 정보를 

컴퓨터가 이해할 수 있는 비트 집합으로 변환을 시켜야하는 데 이 과정을 디지털화라고 일컫습니다.

그런데 정보를 디지털화하기 위해서 무작정 아무 "규칙"없이 처리해서는 않되지 않을까요?



[C++에서의 타입]


C++을 비롯한 여러 언어들은 타입(혹은 자료형)을 이용하여 정보들을 디지털화 시킬 수 있는 "규칙"을 

제공하고 있습니다.

숫자라는 정보를 처리하기 위해서 C++에서는 int, long 등의 타입들을 제공하는데 각 타입들마다에는

각기 다른 아래와 같은 규칙들이 정해져 있습니다.


정보를 표현하기 위해 사용할 비트의 개수는?

정보를 어떤 비트 상태 혹은 방식으로 대응시킬 것인가?

...



[컴퓨터에서 정수 표현하기!]


(정수를 표현하는 규칙)


컴퓨터에서 숫자 그것들 중에서도 정수를 나타내는 규칙을 알아보겠습니다.

우선 컴퓨터에서는 정수를 "부호 없는 정수(Unsinged Type)" "부호 있는 정수(Singed Type)"으로 나눌 수 있겠습니다.

(이렇게 둘로 나눈 데에는 다 이유가 있겠죠? 불필요하게 이 둘을 나누지는 않았을 겁니다.)

먼저 "부호 없는 정수"의 비트 대응 방식을 살펴보겠습니다.

컴퓨터는 부호 없는 정수들을 "2진법"으로 비트들을 대응시켜서 표현합니다.


---------------------------------

부호 없는 정수(Unsinged Type)

---------------------------------

       4         |         0100

       3         |         0011

       2         |         0010

       1         |         0001

       0         |         0000

---------------------------------


이번에는 "부호 있는 정수"의 비트 대응 방식을 살펴보겠습니다.

컴퓨터는 부호 있는 정수들을 "2의 보수법"으로 비트들을 대응시켜서 표현합니다.

"1의 보수법"을 사용하지 않는 이유는 1의 보수법을 이용할 시에 0을 표현하는 비트 방식

"모든 비트가 0일 때""모든 비트가 1일 때" 두 가지로 표현가능하기 때문입니다.

0을 표현하는 방식에 혼동이 있으므로 사용이 불가능합니다.


---------------------------------

부호 있는 정수(Singed Type)

---------------------------------

       2         |         0010

       1         |         0001

       0         |         0000

      -1         |         1111

      -2         |         1110

---------------------------------




(실제 환경에서의 테스트)


과연 실제로 컴퓨터는 "2진법""2의 보수법"으로 "부호 없는 정수""부호 있는 정수"를 

표현하는 지를 확인해보겠습니다.

테스트 환경은 클라우드 IDE인 구름 IDE를 이용하였고 운영체제는 Ubuntu 64bit 입니다.

헤더파일은 <iostream>과 비트 표현을 위해 <bitset>을 사용하였습니다.


부호 없는 정수를 테스트하기 위해 unsinged int 타입을 선정하여 테스트하였습니다.


코드:



콘솔:


 

32개의 비트(=4바이트)를 가지고 2진법으로 숫자를 표현하는 것을 확인할 수 있습니다.


이번에는 부호 있는 정수를 테스트하기 위해 int 타입을 선정하여 테스트하였습니다.


코드:


 


콘솔:



마찬가지로 32개의 비트를 가지고 2의 보수법으로 숫자를 표현하는 것을 확인할 수 있습니다.



[x86 & x64 아키텍처]


앞서 코드와 콘솔을 보여주기 전에 테스트 환경에 대해 언급한 것데에는 

타입의 크기가 플랫폼에 종속적이기 때문입니다.

아래의 표는 같은 32비트 또는 64비트 운영체제라도 타입의 크기가 다름을 알려주는 표입니다.


 


32비트 리눅스와 윈도우는 같은 ILP32라는 같은 데이터 모델을 체택하지만

64비트에 와서는 각각 LP64 LLP64 다른 데이터 모델을 체택함으로서 long타입에서

타입의 크기가 달라짐을 알 수 있습니다.

Comments