본문 바로가기
컴퓨터공학/기초

이진수로 숫자와 문자 나타내기

by 하이방가루 2022. 7. 28.
728x90
반응형

이 글은 Crash Course의 Computer Science를 보고 정리한 글입니다.

두 가지 상태는 참과 거짓 대신에 0과 1을 사용하여 나타낼 수 있다. 이것은 숫자를 나타낼 때 매우 유용하다. 만약 큰 수를 나타내고 싶다면 단순히 이진 숫자들을 더하기만 하면 되기 때문이다. 이것은 우리가 잘 알고 있는 십진법과 동일한 방식으로 작동한다. 10진수는 오직 10가지(0~9)의 한 자리의 숫자가 있다. 9보다 큰 수를 만들기 위해서는 그 앞쪽에 하나의 숫자를 추가하기만 하면 된다. 이진수에서도 똑같은 방법으로 작동한다.

 

예를 들어 234는 2*100, 3*10, 4*1을 합하여 얻을 수 있는데 이것은 각각의 자릿수에 곱하는 수의 차이(승수)를 주목해야 한다. 100과 10과 1, 각각의 곱하는 수는 오른쪽의 것보다 10배 더 크다. 이는 각각의 자릿수에서 0부터 9까지 사용한 다음 자릿수로 이동해야 하는 이유를 말해준다. 이러한 이유로 10기반 표기법(Base-Ten Notation)이라고 부르기도 하고, 10을 의미하는 deci가 들어간 decial notation(십진수)라고 부르기도 한다.

 

마찬가지로 이진법에서는 1과 0만 사용할 수 있기 때문에 하나의 자릿수가 오른쪽에 있는 수보다 2배 더 커야 된다는 걸 의미한다. 100과 10과 1을 사용하는 대신에 4와 2와 1을 사용한다고 생각하면 된다. 예를 들어 101이라는 이진수는 1*4, 0*2, 1*1을 합하여 얻을 수 있는 수(5)를 의미한다. 마찬가지로 더 큰 숫자를 나타내기 위해서 이진수는 십진수보다 더 많은 자릿수를 필요로 한다.

 

이진수(Binary Digit)에서 1과 0은 각각 비트(Bit)라고 불린다. 컴퓨팅에서 흔히 쓰이는 크기 단위인 바이트(Byte)는 8비트를 사용하는데 가장 작은 값은 00000000 (0), 가장 큰 값은 11111111 (255)로 256가지의 다른 값, 또는 2의 8승수의 값을 표현할 수 있다. 1킬로그램이 1000그램인것처럼, 1킬로바이트(KB)는 1000바이트, 8000비트를 의미한다. 마찬가지로 메가바이트(MB)는 백만 바이트를, 기가바이트(GB)는 10억 바이트를 의미한다.(오늘날에는 테라바이트(TB)의 저장공간이 있는 하드 드라이브를 흔히 쓰고 있다.) 하지만 이건 항상 옳진 않다. 이진수에서 킬로바이트는 2의 10승(10진수로 1024)바이트를 의미한다. 1000도 킬로바이트를 언급할 때 맞긴 하지만, 그것만이 옳은 정의가 아니라는 것을 알아야 한다.

 

32비트나 64비트 컴퓨터라는 용어에 대해서도 들어봤을 것이다. 이것은 컴퓨터가 32나 64비트의 덩어리들로 작동한다는 것을 말한다. 32비트로 나타낼 수 있는 가장 큰 숫자는 43억 미만의 숫자이다. 물론, 모든 수가 양수인 건 아니다. 그래서 우리는 양수와 음수를 나타낼 방법이 필요한데, 대부분의 컴퓨터는 부호의 첫 번째 비트에서 1을 음의 값, 0을 양의 값을 나타내는 신호로 사용한다. 그리고 나머지 31비트는 그 숫자 자체를 나타내는데 쓴다. 현재는 경제규모가 커지면서 32비트만으로는 숫자를 표현하는데 한계가 있어서 64비트를 쓴다. 64비트로 나타낼 수 있는 가장 큰 숫자는 대략 920경($9.2*10^{18}$) 정도이다

 

또한 컴퓨터는 위치를 표시할 수 있어야만 한다. 주소(Addresses)라고 부르는 저장공간에 저장하고 검색하기 위해서 필요하다. 컴퓨터의 메모리가 기가바이트와 테라바이트, 즉 수 조의 바이트로 커지면서 64비트 메모리 주소 또한 필요해졌다. 그리고 컴퓨터는 음수와 양수뿐만 아니라 정수가 아닌 다른 수도 다룰 수 있어야만 한다. 2.71828(오일러 수)이나 3.141592(원주율)와 같은 수들을 말이다. 이것들을 부동 소수점(Floating Point)이라고 불렀다. 왜냐하면 소수점은 수들 사이로 이동이 가능했기 때문이다.

 

부동 소수점을 나타내기 위해 여러 방법들이 개발되었다. 가장 일반적인 것은 IEEE754 표준이다. 이 표준은 소수를 과학적인 표기법으로 저장한다. 예를 들어, 987.654은 $0.987654*10^3$으로 저장한다. 여기에 두 가지 중요한 수가 있는데 987654는 유효숫자(Significand)라고 하고 3은 지수(Exponent)라고 한다.

32비트 부동 소수점 표기법에서, 첫 번째 비트는 양이나 음의 부호를 나타내는 숫자를 넣는 데 사용한다. 다음 8비트는 지수를 저장하는 데에 사용하고 나머지 23비트는 유효숫자를 저장하는 데에 사용한다.

 

컴퓨터는 문자를 저장하는 데에 특별한 저장공간을 갖기보단 문자를 나타낼 때 단순히 숫자를 사용한다. 가장 직접적인 접근 방식은 단순하게 문자들에 번호는 매기는 방법이다. A는 1, B는 2, C는 3 등등

사실 영국의 유명한 작가인 Francis Bacon은 26개의 모든 알파벳을 암호화하는 데에 5비트의 연속된 순서를 사용했다. 1600년대에 비밀 메시지를 보내는 데에 말이다. 이 5비트는 32가지 값을 저장할 수 있었기에 26개의 문자를 나타내는 데에 적합했지만 구두점, 숫자, 대소문자를 나타내기에는 부적합했다. 정보 교환을 위한 미국의 표준 코드인 ASCII는 1963년에 발명되었다. ASCII는 7비트의 코드였고 128개의 다른 값들을 저장할 수 있었다. 이 확장된 범위를 사용하면 대소문자, 0~9의 숫자, @기호나 구두점, 줄 바꿈 문자와 같은 상징적인 것들도 인코딩할 수 있게 됐다.

ASCII는 초기의 표준이었기 때문에 널리 사용되었고 다른 회사에서 만든 여러 컴퓨터와 데이터를 교환하는 데 중요하게 사용되었다. 보편적으로 정보를 교환할 수 있는 이 능력을 "상호 운용성(Interoperability)"이라고 한다.

 

하지만 ASCII는 큰 한계가 있었는데 바로 영어를 위해서만 설계되었다는 점이다. 이러한 점 때문에 각각의 나라는 다양한 바이트의 인코딩 구조를 개발했으며 이들은 서로 호환되지 않았다. 일본은 이 인코딩 문제를 잘 알고 있어서 특별한 이름을 붙이기도 했다. "모지바케(Mojibake)"라는 뒤섞인 글자를 의미한다.

따라서 유니코드라는 하나의 형식이 탄생했다. 1992년에 제정된 이 프로젝트는 마침내 각각의 국제적인 제도를 없애고 하나의 보편적인 인코딩 구조로 대체했다. 유니코드의 가장 일반적인 버전은 16비트 공간을 사용해서 백만 개가 넘는 코드를 넣을 수 있었다. 여태 사용되었던 모든 언어에 있는 각각의 글자들에 숫자를 지정하기에 충분했다. 100가지가 넘는 종류의 무자 12만 개 이상이 있다. 또한 수학적인 기호들과 이모티콘과 같은 기호들도 포함할 수도 있었다.

 

또한 ASCII는 문자를 이진수로 인코딩하는 체계를 정의했는데 이것은 mp3와 gif와 같은 다른 파일 형식들이 사용하는 체계에 사용됐다. 이진수를 사용해 음악 안에 있는 소리, 영화나 사진 안에 있는 픽셀의 색상들을 인코딩했다.

가장 중요한 건, 이 표면적인 것들이 길고 긴 연속의 비트열로 이어진다는 것이다. 문자메시지, 유튜브 비디오, 인터넷의 모든 웹페이지, 심지어 컴퓨터의 운영 체계까지도 0과 1의 연속일 뿐이다. 

728x90
반응형

'컴퓨터공학 > 기초' 카테고리의 다른 글

레지스터와 RAM  (0) 2022.07.30
컴퓨터는 어떻게 계산할까?-ALU편  (0) 2022.07.28
부울 연산과 논리 게이트  (0) 2022.07.26
전자 컴퓨팅  (0) 2022.07.26
초기컴퓨팅  (0) 2022.07.24

댓글