본문 바로가기

C언어_VisualStudio

#6-2 변수(variable)_메인 메모리, 정수형 변수 저장방법

  오늘은 메인 메모리를 가볍게 보고 정수형 변수가 어떻게 저장되는지를 정리하려고 한다. 정수형 변수가 저장되는지를 볼 때, 보수라는 개념이 나오는데 나는 처음에 이 보수라는 것을 이해할 때 조금 어려웠었다. 까먹지 않기 위해서 이 부분을 좀 상세히 정리하려고 한다. :-)

 

  변수의 값은 메인 메모리에 저장되고 이진수의 형태로 저장된다. 변수에 저장할 수 있는 값은 한계가 있기 때문에 무한히 크거나 무한히 작은 수를 저장하려고 하면 문제가 생긴다.

 

  메인 메모리(Main Memory)를하드 디스크와 비교 하면 다음과 같은 특징이 있다. 메인 메모리는 컴퓨터의 전원이 꺼지면 자료가 없어진다. 하드 디스크보다 속도(정보를 읽고 쓰는 속도)가 매우 빠르다. 가격이 비싸다. 하드 디스크는 컴퓨터의 전원이 꺼져도 자료가 유지된다. 속도가 느리다. 메인 메모리에 비해 가격이 저렴하다. 

 

참고) 메인 메모리(Main Memory)란?

  컴퓨터 내부에 존재하여 현재 처리하고 있는 내용이 불려지는 메모리로, 반도체 소자로 이루어져 있으며 용량이 작지만 처리속도가 빠른 임의 접근 방식의 기억장치다. 이는 중앙처리장치(CPU)나 다른 장치들이 데이터를 잠시 저장해 두었다가 꺼내 쓸 때 사용하는 장치다. 이는 메인 메모리라 하며, 크게 ROM과 RAM이 있다. ROM은 읽기 전용 기억장치로 컴퓨터의 전원이 꺼져도 정보가 사라지지 않는 비휘발성 기억장치다. 반면 RAM은 CPU가 필요로 하는 데이터와 명령어 체계를 임시로 보관하는 장소로 읽고 쓰는 것이 가능하다. 이는 전원이 꺼지면 저장된 데이터도 함께 지워지는 휘발성 메모리다. 

(https://terms.naver.com/entry.naver?docId=932296&cid=43667&categoryId=43667)

 

  메인 메모리의 크기로는 현재 4GByte가 일반적이다. 참고로 Byte는 저장할 수 있는 0 또는 1의 개수를 의미하며 크기는 다음과 같다. 

  • bit: 가장 기본적인 정보 저장 단위로서 한 개의 0 또는 1을 저장할 수 있다.
  • Byte = 8bit
  • 1 KByte = 1024 Byte
  • 1 MByte = 1024 KByte
  • 1 GByte = 1024 MByte

이것을 참고하면 4 GByte에 대락 320억 bit를 저장할 수 있다. 

 

정수형 변수 저장방법

  C에서는 정수를 저장하기 위해 int(integer) 형 변수를 제공한다. int형으로 선언한 변수는 일반적으로 4Byte를 할당받는다. (이것은 컴퓨터마다 다를 수 있다.) 4Byte는 32bit이다. 유한한 공간을 제공받기 때문에 표현할 수 있는 값의 범위도 유한하다. 즉, 아주 큰 정수나 아주 작은 정수는 표현할 수 없다. 표현이 가능한 정수의 범위는 -2,147,483,648 ~ +2,147,483,647까지이다.  

 

  정수를 저장하기 위해 8bit만을 사용해야 한다. 00000000(2)을 0이라 하고 11111111(2)은 255로 한다고 하면 0~255까지 총 256개의 정수를 표현할 수 있다. 단, 이때의 문제점은 0과 양의 정수만을 표현할 수 있다는 것이다.

 

  음의 정수일 경우 어떻게 표현해야 하는 것일까? 맨 앞의 bit가 부호를 의미하도록 하면 된다. 8bit 중 맨 앞의 bit는 부호를 저장하도록 한다. 맨 앞의 bit가 0일 경우 양수를 의미하고 맨 앞의 bit가 1일 경우 음수를 의미한다. 그리고 나머지 7bit는 숫자 값을 의미하도록 하면 된다. 예를 들어 +1과 -1을 나타내 보면 다음과 같은데, 00000001(2)은 +1을 의미하고 10000001(2)은 -1을 의미한다는 말이 된다. 이런 식으로 하면 표현할 수 있는 숫자의 범위는 -127 ~ +127까지 이다.

 

  맨 앞의 bit가 부호를 의미하도록 하는 방법은 좋은 방법이지만 다음과 같은 문제가 생긴다. 1+(-1)를 계산해보면 문제가 있다는 것을 알 수 있다. 1+(-1)=00000001(2)+10000001(2)=10000010(2)=-2 라는 엉뚱한 결과가 나온다.

 

  이를 해결하기 위해 2의 보수를 이용한다. 2의 보수를 사용하면 음수를 효과적으로 표현하기 할 수 있다. 1과 2의 보수를 보면 다음과 같다.

  • 1의 보수: 0을 1로, 1을 0으로 바꾼 것을 의미한다.
  • 2의 보수: 1의 보수 결과에 1을 더한다.

  앞의 방법(맨 앞의 bit가 부호를 의미하도록 하는 방법)처럼 맨 앞의 bit가 0이면 양수이고, 1이면 음수라는 것이 동일하지만 뒷부분에 값을 저장하는 방식이 앞의 방법과는 다르다. 2의 보수를 이용하는 방법에서 -1을 표현하는 방법을 보자. +1은 00000001로 표시한다. 이 수의 1의 보수를 구하면 11111110으로 바뀐다. 여기에 1을 더하면 2의 보수가 되고 11111111을 -1로 사용한다. 이 방식으로 1+(-1)의 값을 다시 계산해보자. 1+(-1)=00000001(2)+11111111(2)=00000000(2)=0 으로 계산이 잘 맞아떨어진다. 

 

참고) 보수란? 일반적으로 n에 대한 m의 보수는 n-m을 뜻하는데, 보수는 m에서 n을 만들기 위해 보충해야 하는 수 n-m을 가리키는 용어다. (https://terms.naver.com/entry.naver?docId=3405109&cid=47324&categoryId=47324)