티스토리 뷰

1. int

  프로그래밍을 하는데에 있어서 가장 많이 쓰이는 것이 int형이라고 할 수 있습니다.

int는 일반적으로 4바이트를 표현할 수 있으며 형의 범위는  -32768~32767인데, 이 int형이 메모리에 물리적으로 차지하고 있는 구조를 살펴보면 다음과 같이 표현됩니다.


[ 1비트(부호비트) | 31비트]


여기서 부호비트란 말 그대로 부호를 표시해주는 비트를 말합니다. 1일 경우에는 음수를 나타내는 것이고, 0이면 반대로 양수라는 것을 나타냅니다.


이러한 구조가 정확히 어떻게 표현되는지 예를 들어보겠습니다.


정수 5를 한번 int형 메모리 구조로 표현해 볼까요?


먼저, 5는 음수가 아니니 부호비트가 0일 것입니다. 5를 2진수로 표현하면 101입니다.


정리해보면 앞에 1비트는 0, 뒤에 31비트는 0000000000000000000000000000101 입니다.(밑줄 친 부분은 사용하지 않는 부분이지만 32비트를 채워야하기 때문에 0으로 표시됩니다.)


이 두 가지를 합치면 간단한 int형 변수 구조의 예가 되겠습니다.


추가적으로 음수는 어떻게 표현하는지 알아볼까요?


CPU는 제어장치와 연산장치로 여러가지 작업을 처리하는 능력을 가지고 있습니다. 이 연산 장치는 더하기만을 처리하는 가산기, 빼기를 처리하는 감산기 등 여러가지가 있지만, 우리가 일반적으로 사용하는 CPU 등에는 가산기밖에 들어있지 않습니다.(대체적인 이유로 감산기를 넣을 경우 회로가 너무 복잡해져서 그렇습니다.)


그래서 CPU는 이 가산기로 빼기와 곱하기 나누기를 직접 수행해야 합니다.(여기서 곱하기와 나누기는 음수표현과 큰 관련이 없습니다.)


어떻게 더하기로 뺄샘을 연산하고 음수를 표현할 수 있을까요?


대체적으로 1의 보수와 2의 보수를 사용하여 연산을 하여 표현할 수 있습니다.


한번 24를 각각 1의 보수와 2의 보수를 사용하여 음수로 표현해볼까요?


먼저 24를 32비트의 int형으로 나타내보면 00000000000000000000000000011000입니다.


1의 보수를 표현하려면 쉽게 말해서 이 32비트 숫자들을 모두 반전시켜야합니다.


그러면 11111111111111111111111111100111 이렇게 나오겠죠. 이게 바로 1의 보수로 표현한 -24입니다.


2의 보수는 위에 나온 1의 보수에 1을 더한 값이 바로 2의 보수로 표현한 -24의 값입니다.


사실 일반적으로 2의 보수를 많이쓰니 참고하시기 바랍니다.


(참고 : 9의 보수, 10의 보수)


여기까지가 int형의 구조입니다.



2. float

  float는 기본적인 실수형을 표현할 때 쓰입니다. 그 구조를 보면


[1비트(부호비트)|8비트(지수)|23비트(가수)]


이런 구조를 가지고 있습니다. 앞에 1비트는 int형과 같이 부호비트가 표시되고, 그 뒤로 8비트의 지수 23비트의 가수가 차례대로 붙어집니다.


이해를 위하여 예시를 들어보겠습니다.


10.625를 2진수로 표현해보면 1010.101이 됩니다.


이 수를 쉬프트 연산을 통하여 1.010101로 표현하면 이 쉬프트 연산을 통하여 나온 수에 2^3이라는 수를 곱해주게 될 경우 원래의 숫자를 표현할 수 있게됩니다.


여기서 우리는 010101이라는 가수부분에 들어갈 숫자를 알 수 있습니다.


지수가 조금 복잡한데, 이 지수를 표현하기 위해서는 초과법을 이용해야합니다.


파란색으로 표현한 3이라는 숫자를 지수에 맞게 표현하려면 127이라는 기준값을 사용해야합니다.


[0                127                255]


float에 표현될 지수는 이 기준값에 실제 지수부분에 들어가는 수(여기서는 3)를 더하여 형성됩니다. 그러므로 127에 위에 표현된 3을 더하면 130입니다.


[0                127 130         255]


이 130을 2진수로 표현하면 10000010입니다.


이제 다 구했습니다.


부호비트는 0, 지수는 10000010, 가수는 01010100000000000000000입니다.(자리를 채우기 위하여 사용된 0은 여기서 오른쪽에 붙습니다.)


이렇게해서 10.625는 01000001001010100000000000000000라는 것을 알 수 있습니다.



3. double

  double형은 64비트의 자료형으로써 아주 큰 수를 표현할 때 쓰이며 그 범위는 -10^308~10^308입니다. 구조는 다음과 같습니다.


[1비트(부호비트)|11비트(지수)|52비트(가수)]


float보다 더 큰 수를 표현할 수 있다는 것외에 표현 방식은 같으니 그 설명들은 넘어가겠습니다.



4. char

  char은 문자를 나타내는 대표적인 자료형입니다. 8비트(1바이트)로 문자 한 자를 나타낼 수 있으며 범위는 -127~128까지입니다.. 구조를 보면 다음과 같습니다.


[1비트(부호비트)|7비트]


char은 표현하기가 좀 간단합니다. 그냥 Ascii코드 값이 7비트에 들어가는 구조로 보시면 되겠습니다.


예를 들어보자면 'A'의 Ascii코드를 65라고 합시다. 65를 2진수로 표현하면 1000001이렇게 됩니다. 65는 양수이기 때문에 부호비트가 0이죠. 이렇게해서 자료를 표현하면 01000001이 됩니다.



5. long *

  long int의 경우 [1비트(부호비트)|53비트]로 구성되어있으며, 범위는 -2,147,483,648~2,147,483,647입니다.

  long double의 경우 [1비트(부호비트)|15비트(지수)|64비트(가수)]로 구성되어있으며, 범위는 3.4*10^-4932~1.1*10^4932입니다.



6. unsigned *

  unsigned는 부호를 표시하지 않겠다는 말로써 *부분에 들어갈 자료형의 음수부분의 범위를 양수에 사용하겠다고 쉽게 풀이하시면 됩니다.



7. 2진수의 계산

  2진수의 계산은 일반적으로 1의 보수와 2의 보수를 사용합니다.

먼저 10진수 8과 4를 가지고 빼기를 하여보겠습니다.


8 - 4 = 4


상당히 복잡하고 난이도가 높은 계산이군요.

이를 4비트 2진수에 적용하여 보죠


2진수 8 : 1000

2진수 4 : 0100


글의 처음에 일반 CPU에는 가산기만 있다고 하였습니다.. 그렇기 때문에 컴퓨터에게 감산을 수행하는 1000-0100이라는 말은 말이 안되는 겁니다.


그러기 위하여 우리는 1의 보수나 2의 보수를 이용하여 뒤에 4를 음수로 변환하여 8에 더해주는 방법을 사용하면됩니다. 2의 보수를 많이 쓰기 때문에 2의 보수를 이용하겠습니다.


위의 방법으로 0100를 음수로 표현하면 우선 1의 보수로 1011이라는 값을 먼저 구한 후 1을 더해줍니다.


그러면 -4의 값은 1100이죠.


이 값을 8과 더 해보면 1000+1100=10100입니다. 4비트이므로 앞에 있는 1을 자르게 되면 0100이 답으로 나옵니다. 0100를 10진수로 바꾸면 답이 4죠?


이렇게 되는겁니다.


재미로 하나만 더 알아보겠습니다.


9의 보수하고 10의 보수라고 있는데 이것은 10진수에 쓰는 것들입니다.


한 자리의 10진수를 가지고 계산을 해보죠.


8에 4뺀 값을 10의 보수를 이용하여 풀어보면


먼저 4의 10의 보수를 구하려면 10-4를 하면 됩니다. 그러면  6이죠.


여기서 8+6을 해봅니다. 14가 나오는군요.


위에서 한 자리의 10진수라고 했으므로 앞에 1을 잘라주면


답은 4가 되는겁니다.


(출처 : '데이터형에 따른 메모리 구조와 연산' - 네이버 지식iN)

댓글
안내
궁금한 점을 댓글로 남겨주시면 답변해 드립니다.