logo

[썰] 진수법/비트/바이트

2010.08.27 22:07

으르릉 조회 수:13181

노바박사님의 글을 읽고 탄력을 받아 게임 에디트와 관련된 몇가지 썰을 한번 풀어보려 합니다. - 할 일도 많은데 이러고 있음. -
그 첫번째로... 일단 진수/비트/바이트에 대해 썰을 풀어보겠습니다. 단순히 게임 에디트 뿐 아니라, 컴퓨터 프로그래밍의 기초와도 연결되는 내용이므로 가급적 정독하실... 필요는 없을까요?? 아무튼 갑니다.


1. 진법

 

 컴퓨터computer라는 단어는 계산하다compute라는 단어에서 파생된 사실에 대해 모르시는 분은 없을겁니다. 그럼 계산의 기초는?? 사칙연산. 사칙연산의 필수 요소는?? 수數 or 숫자numeral. 그리고 진법이라 함은 우리가 수를 세면서 수의 단위별로 표현할 수 있는 문자의 수를 이야기한다고 날림정의를 내릴 수 있겠습니다. -[수]만 세번 나왔어... 아니 네번인가?- 한가지 확실한건, 현대 인류가 사용하는 숫자는 0~9의 10가지 문자이고 이를 10진법Decimal System이라 부른다는 겁니다.
 약간 옆길로 새서... 이 10진법의 기원에 대해서는 참으로 단순한 이유가 있습니다. 사람을 포함한 유인원의 손가락 갯수가 총 10개인 관계로 10진법인겁니다. 물론 문화권에 따라 한손만을 사용하는 5진법, 발가락을 동시에 이용하는 20진법, 고대 아랍 문화권에서 사용되었다고 하는 60진법 등등;;; 60진법의 발상은 도저히 이해를 못하겠더군요.
 아무튼 현대인류는 10진법을 사용합니다. 그럼 컴퓨터는?? 2진법Binary System이지요.


2. 2진법과 비트bit

 

 90년대 들어 한국에 컴퓨터의 불꽃이 서서히 타오르기 시작하던 시절, 컴퓨터를 소개하는 각종 서적에는 2진법에 대해 상당히 애매모호하게 설명되어 있었습니다. 뭐... 이래저래 취합해보자면, 있다/없다, 긍정/부정, On/Off 등등을 나타내는 데에 역사적으로 여러가지 신호법이 사용되었으며 이는 컴퓨터에서 사용하는 2진법과 다를게 없다... 이딴 내용인데... 핵심을 짚어보자면 컴퓨터는 0과 1의 숫자 두개로 의사를 표현할 수 있는 2진법이 적용된다는 것 뿐입니다. 그리고 비트bit란 2진법에서 숫자를 집어넣을 자릿수를 의미한다고 보시면 되겠습니다. 이 비트들이 모여서 여러 자릿수를 이룰 때 8비트/16비트/32비트 등의 단위체로 불립니다.
 그럼 컴퓨터에는 왜 2진법이 사용되는가. 컴퓨터는 전기신호를 먹고 사는 일종의 기계입니다. 태초부터 현대까지 컴퓨터의 플랫폼이 진화하면서도 오직 전기의 흐름을 제어할 수 있었을 뿐, 전기신호의 레벨을 조작하고 인식시킬 수 있는 능력은 전무함을 비춰보았을 때 2진수 이외의 해법은 없었다고 보는게 타당할 겁니다. 물론 가깝거나 먼 미래의 컴퓨터에는 1비트를 몇십진법으로 구현할 수 있는 능력이 적용될 수도 있겠지만 아직은 아니지요.


3. 비트bit와 바이트Byte

 

 위에서 비트들이 모여서 일종의 단위체를 구현한다고 썰을 풀었는데요. 여기에서 중요한 개념이 나옵니다. 바로 바이트Byte입니다. 널리 알려진 상식으로 8비트=1바이트 라는 개념을 모르시는 분은 없을 테고... 이 바이트란 것은 사람을 위해 만들어진 개념입니다. 단순히 비트만으로 데이터를 식별하는데 어려움을 느껴서 만들어진거죠.
 왜 8비트인가 하는 의문을 가져보신 분 계실지 모르겠습니다만, 이는 컴퓨터 플랫폼 개발 시 합의된 사항이라 할 수 있겠네요. 일반적으로 컴퓨터에서는 2진법이 사용되며, 단위의 갯수 역시 2의 제곱수에 따라 얻어집니다. 부수적인 이유로, 2의 4제곱은 겨우 16인데 이를 가지고 문자를 표현하는 것은 어불성설이요, 16비트는 너무 많아서 어지러우니 8비트로 결론이 난 겁니다. 물론 양키권 문화에서 개발되었으니 동방의 언어들을 표현하는데에는 어려움이 있었습니다만 아무튼 요새는 해결된거니까 넘어가지요.


4. 16진법Hexa-decimal System

 

 순수하게 1바이트를 연산에 그대로 이용하는 경우는 별로 없습니다. 위에서 설명한 개념을 그대로 확장하자면 1바이트는 256진수가 되어버리니까요. 물론 아스키 코드ASCii Code라고 해서 1바이트의 매 값마다 문자를 하나씩 할당해서 사용하기도 합니다만, 이는 표현의 문제이지 컴퓨터의 연산과는 별개입니다.
 재반복하자면, 일단 컴퓨터의 연산 자체는 0과 1의 변화만으로 이루어집니다. 여기서 도출되는 문제. 사람은 도저히 2진수 연산이 불가능합니다. 2진수로 표현된 수를 그대로 읽어서 얼마나 되는지 이해할 수 있는 사람 자체가 없는거죠. 물론 단순 덧/뺄셈 정도는 가능합니다. 곱셈은? 나눗셈은? 2진수을 10진법으로 바꿔서 연산한 다음에 다시 2진수로 변환해주는 방법 말고 또 방법이 있다는 분 혹시 계시면 손 한번 들어보세요.
 이를 위한 해결책으로 16진수가 등장했습니다. 이 역시 사람을 위한 편의 제공의 일환으로 나타난 개념으로, 10진수를 기준으로 0~9까지는 숫자를 그대로 쓰고, 10~15를 대체해서 표현하기 위해 알파벳 A~F를 사용하는, 말 그대로 16개의 문자를 한 자리로 사용하는 겁니다. 다만, 이는 2진법 연산의 난해함을 해결하고자 나타난 개념일 뿐이므로, 어디 가셔서 컴퓨터는 16진법을 사용한다는 등의 망발은 말아주시기 바랍니다.
 마침 1바이트는 8비트이며 16의 제곱과 마찬가지인 바, 1바이트를 표현할 때 16진수 2자리로 표현하는 방식이 일반적입니다.
 1바이트를 수학적인 2/10/16진수로 표현하게 되면 다음의 예시와 같이 됩니다.

 

  00000001(2)=  1(10)= 1(16)
  10000001(2)=128(10)=81(16)
  11111111(2)=255(10)=FF(16)

 설명을 간단히 하기 위해 1바이트의 최대값을 사용했습니다만 아무튼 이해는 충분히 되셨을겁니다.


5. 2진수와 바이트, 그리고 음수negative number

 

 수에 대한 논리 구축을 명확히 하신 분이라면, 2진수의 맹점이 눈에 보이실지도 모르겠네요. 일단 2진수 자체는 수의 단계를 구분했을 때 0이 포함된 자연수에 해당합니다. 물론 2진수 앞에 음수 부호(-)를 붙이거나 2진수 중간에 점을 찍어 표현하는 괴기스런 방법도 있습니다만, 이는 편법일 뿐이고 컴퓨터는 전혀 인식할 수 없지요.
 컴퓨터가 음수를 인식하는 방법은 1바이트의 첫 비트에 그 비밀이 있습니다. 위의 4항에서 예를 들면

 

  00000000(2)=0(10)
  01111111(2)=127(10)
  10000000(2)=-128(10)
  10000001(2)=-127(10)
  11111111(2)=-1(10)

 

 요렇게 되는거죠. 왜 갑자기 숫자가 바뀐건가 물어보신다면... 플랫폼이 그렇게 설계되었기 때문이라 말씀드리겠습니다... 가 아니고... 좀 말이 길어지겠네요.
 기본적으로 컴퓨터에서는 2진수를 10진수로 변환 시 정수 범위로 연산해야 하는 원칙에 따라 음수를 포함하는 경우를 기본 연산법으로 채택하고 있으며, 1바이트를 기준으로 했을 때 첫 비트를 음수 부호로 인식하는겁니다. 물론 2바이트일 경우는 다음과 같겠지요.

 

  0000000000000000(2)=0(10)
  0111111111111111(2)=32767(10)
  1000000000000000(2)=-32768(10)
  1000000000000001(2)=-32767(10)
  1111111111111111(2)=-1(10)

 

 C 프로그래밍을 좀 하시는 분들은 정수(integer)와 실수(float)의 변수 지정 시 unsigned라는 예약어를 사용하는 경우가 있다는 것을 아실겁니다. 이는 음수를 전혀 인정하지 않고 첫 비트를 그대로 숫자로 사용하겠다는 의미인거죠. 간혹 게임 에디트를 하고 나서 보면, 분명 1바이트 최대 수치인 FF로 변경시켰는데 갑자기 음수가 되어 당황하는 경우가 있을겁니다. 요 개념을 모르셔서 그런겁니다.


 자... 일단 기본 개념에 대해 썰을 풀어봤습니다. 요 개념들이 지금 당장에는 도움이 안될지 몰라도, 언젠가는 유용할겁니다.(진짜?)
 뭐;;; 8년 전 쯤에 도스 강좌 올린다고 지랄하다 한번 올리고 땡친 이력이 있는지라.. 언제 다음 글을 올릴진 몰라도..;;;;;;;;
 그럼... 이만... 줄이겠습니다.

 

ps. 괭이꼬리군하 강좌게시판 하나 만드는게 어때?

번호 제목 글쓴이 날짜 조회 수
공지 여러분의 추억과 기억을 풀어주세요 남군™ 2009.10.10 48431
68 리뷰까지는 아니고(3) 원평합전 [7] file 붉은남작 2012.03.24 10042
67 추억의 퀘이크 1..... [1] 조용일 2011.07.08 9910
66 20년 게임 라이프를 회고하며 - 6 [5] file 노바박사 2011.05.23 9168
65 컴퓨터 게임에 미쳐산 지난 이십수년의세월에 남은 조촐한 모습입니다. [11] file 메롱교주 2010.12.29 14111
64 Their Finest Hour _ Lucas Arts(1989) [5] file 대이버 2010.12.28 14304
63 20년 게임 라이프를 회고하며 - 5 [10] file 노바박사 2010.11.11 17165
62 20년 게임 라이프를 회고하며 - 4 [5] file 노바박사 2010.11.07 15063
61 20년 게임 라이프를 회고하며 - 3 [2] file 노바박사 2010.11.07 14222
60 20년 게임 라이프를 회고하며 - 2 [3] file 노바박사 2010.10.26 14875
59 20년 게임 라이프를 회고하며 - 1 [5] file 노바박사 2010.10.24 15079
58 리뷰까지는 아니고(2) 캡틴츠바사를 패러디한 게임 동방사커 [10] file 붉은남작 2010.10.01 16922
57 [리뷰] 시드마이어의 문명 3 (Firaxis, 2001) [10] file 노바박사 2010.09.20 14370
» [썰] 진수법/비트/바이트 [4] 으르릉 2010.08.27 13181
55 [리뷰] 치트엔진 [2] file 노바박사 2010.08.27 21486
54 [리뷰] 스타크래프트2 : 자유의 날개(Blizzard Entertainment, 2010) [10] file 노바박사 2010.08.06 21433
53 리뷰까지는 아니고(1) "민주국가에서 전쟁은 어려워...-독립전쟁" [5] file 붉은남작 2010.08.04 12531
52 [컬럼] 게임괴담 - 혼자 나서면 망해 [11] file 노바박사 2010.06.21 48815
51 [리뷰] 발더스 게이트 2 (Bio Ware, 2000) [19] file 노바박사 2010.06.19 22164
50 [리뷰] 엘더스크롤 1편 - 아레나(Arena) (Bethesda Softworks/1994) - No. 0 번외편 자유도!? 그 난해함에 대하여 [12] file 남군™ 2010.06.14 22013
49 [컬럼] 국내 패키지 게임시장의 몰락사 [12] file 노바박사 2010.06.11 15778