비트 바이트 워드 | C언어 강의 4

비트 바이트 워드

비트(bit) 바이트(byte) 워드(word)는 컴퓨터의 데이터 단위를 표시하는데 사용합니다.

이것들을 모르고 프로그래밍을 시작할 수는 있지만 메모리를 다루는 C언어를 배우기 위해서는 반드시 알고 넘어가야 하는 부분입니다.

컴퓨터에서는 데이터도 메모리 주소도 이 단위로 표시할 수 있습니다. bit는 이진수 byte 는 8진수 워드는 16진수가 기본으로 워드는 시스템의 고유 메모리 단위입니다. 16비트 32비트 64비트도 될 수 있습니다.

윈도우즈 10을 사용한다면 64비트 운영체제일 것 입니다. 메모리 주소를 64비트 (2의64승)까지 사용할 수 있다는 의미입니다.

비트(bit)

비트는 0과 1 만으로 표현하는 숫자입니다. 즉 이진법입니다. 논리 회로에서는 True / False 로 나타낼 수도 있고요. on 과 off 의 상태로도 표현할 수 있습니다. 비트는 가장 심오한 컴퓨터의 기본 단위로써 전자적으로도 트랜지스터를 사용하여 커패시터에 1과 0의 상태를 저장하기 때문에 컴퓨터 그 자체라고 할 수도 있습니다.

CPU는 메모리(반도체)안에 있는 0과1의 상태를 꺼내와서 자신의 작은 메모리인 레지스터(Register)에 넣고 ALU(산술 논리 장치)로 연산을 합니다. 다시 레지스터에서 0과1의 상태를 꺼내서 메모리에 전송하는 일을 반복합니다. 물론 컴퓨터 하드웨어 안은 매우 복잡한 일들이 일어나지만 기본적인 원리는 이와 같습니다.

컴퓨터의 본질은 튜링 머신이며 세상에서 가장 빠른 물질인 전자를 사용하는 방식이 보편화 되있습니다. 그래서 컴퓨터 하드웨어와 소프트웨어 회사들 이름에는 ‘전자(electronics)’가 많이 들어갑니다.(삼성전자, LG전자 등) 언젠가 양자 컴퓨터가 보편화 되는 시대가 오면 ‘삼성양자(samsung quatum)’ 같은 회사가 만들어질지도 모르겠네요. 양자 컴퓨터는 아직 초기 단계고 PC처럼 많은 사람들이 사용할 수 있게 되기 까지는 시간이 꽤 걸릴 것으로 보입니다.

0과 1은 논리 게이트로 처리합니다. 기본은 AND OR NOT 게이트 입니다.

아래 예제는 연산 결과를 보여줍니다. 이진법의 덧셈과 뺄셈을 하더라도 당연히 다른 진법으로 변환이 가능합니다. 단지 인간은 10진법에 익숙하기 때문에 2진법을 배우지 않으면 불편할 수 있습니다.

이것도 수의 감각이라서 처음에는 느낌이 없지만 어느 순간 감이 올 때가 있습니다. 사실 2진법은 매우 직관적인 수 체계입니다. 10개를 생각하는 것보다 0과 1을 떠올리는 것이 더 빠를 때가 있습니다. 있다 없다. 참이다 거짓이다. 처럼 명확한 콘셉이기 때문이죠.

    0000 0000
AND 0000 0101
-------------
    0000 0000

    0101 0000
OR  0000 0101
-------------
    0101 0101

NOT 0000 0101
-------------
    1111 1010

대부분 CPU는 2진법과 2의 보수를 사용해서 덧셈과 뺄셈을 처리할 수 있습니다.

2의 보수

2의 보수를 사용하면 덧셈으로 뺄셈까지 할 수 있습니다.

왜 그런 일을 할까요? 컴퓨터를 설계한 과학자들이 하나의 게이트로 두가지 기능을 구현하는 것이 더 유리하다고 생각했기 때문입니다. 덧셈을 위한 회로, 뺄셈을 위한 회로를 따로 두지 않았습니다.

0000 1011 ... 7

1111 0100 ... 7을 반전

1111 0101 ... 1을 더하면 -7 이된다. (9번째 비트를 날림)

  0000 1011 ...  7
+ 1111 0101 ... -7
-----------
  0000 0000 ...  0

원리적으로 보면 비트를 반전(NOT) 시켜서 더하면 모든 비트가 on(1) 이 됩니다. 예를 들어 0000 과 1111 의 합은 1111 입니다. 여기서 1을 추가하면 숫자적으로는 1 0000 이 됩니다. 그러나 4비트 데이터에는 5비트가 저장되지 않으므로 올린 1이 버려지면서 모든 비트가 0으로 바뀝니다.

이 원리를 이용하여 마이너스 숫자를 만들어 내는 겁니다. C에는 unsigned 부호없는 데이터 형과 signed 부호있는 데이터형이 있는데 부호있는 데이터형이 이와 같은 방식을 사용합니다. 따라서 항상 범위가 잘라지는 것이죠. unsigned char 형은 0부터 255까지 256개를 signed char 형은 -126~125까지 사용할 수 있습니다. 어떻게 비트를 저장하느냐에 따라 데이터 형에 차이가 있습니다.

고급 언어중에서 이렇게 다양한 데이터형을 사용할 수 있는 것은 C언어가 유일합니다. 그 뒤에 나오는 자바와는 벌써 데이터를 다루는 것 부터 차이가 납니다. 비트에 대해서 더 잘 익숙할수록 포인터를 조작하기가 쉽습니다.

바이트(Byte)

비트의 원리를 이해했다면 바이트는 이미 이해한 것입니다.

비트가 제일 정확하긴 한데 맨날 0과1만 가져다 쓰기에는 효율이 떨어집니다. 바이트(Byte)는 비트가 8개 모인 것입니다.

비트를 8개 모아놓으면 아래와 같습니다.

0000 0000 ... 0

0000 0001 ... 1

0000 0010 ... 2

사실 통상적으로 메모리는 1바이트 단위로 접근할 수 있습니다. 메모리의 주소가 0A(16진수) 라면 0에서 10이 떨어진 위치를 말합니다.

C언어에서는 char 가 1바이트를 사용합니다. char 는 문자형이지만 엄밀히 말하면 영어를 위한 문자형입니다. 1바이트에 영문자인 아스키 코드는 들어가지만 한글이나 다른 국가의 언어가 들어가는 것은 불가능합니다. char 는 문자형이지만 바이트 그 자체라서 바이트적인 연산이 가능합니다.

포인터에서도 바이트 단위로 이동하기 위해서 char 형 포인터로 변환하는 경우도 있습니다. char 라는 이름에 너무 구애받지 않는 것이 좋습니다. 컴퓨터를 처음 개발한 시기에는 메모리도 그렇고 컴퓨터의 자원이 지금과 달리 매우 부족했습니다. 부족했다고 해야하나 그래도 그 당시 필요한 작업은 다 했기 때문에… 어쨋든 현재의 시각으로 보면 절대적으로 부족합니다. 요새는 램이 최소 8기가지만 PC의 초기에 8비트 컴퓨터의 메모리가 64KB 하던 시스템이었습니다.(애플 2 같은)

KB(킬로 바이트)는 1024 바이트(2의10승) 입니다. 기가 단위는 바이트로 2의30승입니다. char 라는 이름도 과거의 산물이죠. 자바에서는 byte라는 자료형이 있죠. 문자는 문자열 클래스 String 에서 처리합니다.

char 나 byte 자료형의 이름에는 컴퓨터 역사의 흔적이 묻어있음을 알 수 있습니다.

워드(Word)

워드는 컴퓨터 설계시 기본 메모리 단위입니다. CPU가 메모리에서 레지스터로 데이터를 가져올 때의 데이터 처리단위로 볼 수 있습니다. 워드라 하더라도 비트로 되어 있으니까 CPU가 비트를 담는 손의 크기 정도로 볼 수 있습니다.

원래는 16비트에서 시작했습니다. 시스템마다 차이가 있는데 어셈블리어에서 보통 WORD 라 하면 16비트 DWORD 라 하면 32비트를 의미합니다.

데이터를 가져오는 단위가 되니까 어떤 워드를 사용하느냐에 따라 속도 차이가 납니다. 물론 어플리케이션의 속도가 한가지 요소만 가지고 결정되는 것은 아닙니다. 오늘날 컴퓨터와 운영체제의 구조는 생각보다 복잡하기 때문에 32비트가 64비트보다 더 빠르게 동작한다거나 하는 일도 있습니다.

이것은 초반에 너무 깊이 파고 들어갈 필요까지는 없으니 참고 정도가 좋습니다.

요약

데이터형을 이해하기 위한 기초 지식으로 비트 바이트 워드에 대해서 알아봤습니다.

컴퓨터를 진정으로 이해하려면 컴퓨터 구조에 대한 지식을 한층한층 쌓아가는 것 말고는 방법이 없습니다. 컴퓨터 안에서 일어나는 일은 모두 전자적인 일이며 사람이 전자가 움직이는 것까지 볼 수는 없습니다. (과학자들이 최근 원자 사진을 찍는데 까지는 성공했다고는 함)

우리는 출력장치인 모니터에서 받은 피드백을 바탕으로 컴퓨터의 동작원리에 대해서 이해하게 됩니다. 보이지 않은 것들을 머리속에서 이해하고 구성하는 것은 생각보다 어렵습니다. 어느정도의 예술성도 필요하다고 봅니다. 서양에서는 기술을 Art(예술) – art of programming 라고 하죠. 어느정도는 재능이 있어야 하다 보니까 잘하는 사람에게 샘도 나게 되는 거구요. 그래서 실리콘 밸리의 IT천재들의 실력에 감탄하게 됩니다.

C언어는 이렇게 컴퓨터 내부에서 일어나는 일을 논리적으로 경험적으로 머리속에 세밀하게 재구성하는 능력을 길러주는 언어입니다. C언어를 가장 찬양하는 사람중 하나는 리눅스 커널의 창시자 리누즈 토발즈입니다. 운영체제는 컴퓨터 내부 관리를 하는 프로그램으로 C언어로 운영체제를 작성한다는 것은 이 언어가 어떤 성격인지 알 수 있습니다.

아직도 전세계 적으로는 C언어를 많이 사용합니다. 하지만 C언어가 새롭게 컴퓨터공학과에 입학해서 열심히 파고들만한 언어는 아닙니다. 대학원에 진학하고 컴퓨터 공학을 연구하기 위해선 필요하겠지만 취직적으로는 크게 메리트가 있는 건 아닙니다.

하지만 컴퓨터를 이해하기 위한 기본 도구로써 상당한 도움이 될 겁니다.

참고문서

이진법과 2의 보수

Difference among Bit, Byte and Words | Computer

Bits Bytes and Words (sjsu.edu)

Leave a Comment