※ 질문/내용오류/공유할 내용이 있다면 jinkilee73@gmail.com으로 메일 주세요 :-)


컴퓨터에서 데이터를 다루는 방법에 대해서 생각해보자.


컴퓨터는 당연히 비트 단위로 연산을 한다. 그렇다면 흔히 말하는 비트가 무엇의 약자인가?

BIT : BInary digiT의 약자이다.

즉, 0과 1로 이루어진 데이터를 이해하는 것이 컴퓨터이다.


이러한 비트가 8개 모여있으면 8-bit(= 1 byte)라고 한다. 바이트의 학문적 정의는 The smallest addressable unit이다. 즉, 메모리에 지정할 수 있는 가장 작은 단위를 의미한다.

 

보통 현재 대부분의 컴퓨터는 32비트 CPU를 사용하고 있다. 여기에서 32비트는 무슨 의미인가? 컴퓨터 내부의 메인보드를 보면 버스라고 하는 데이터의 이동 통로가 있다. 쉽게 말해서 전선이 메인보드에 아주 작게 달라붙어있다고 생각하면 될 것 같다. 아무튼 이 버스가 32줄이 있다고 하는데... 그래서 32비트이다. 다른 말로 말하면 한번에 32개의 줄로부터 데이터가 하나 전송된다는 말이다. 가만히 생각해보자. 32비트면 4바이트다. 그러니까 32비트에서 데이터들은 32비트 혹은 그 이내로 표현 가능해야한다는 뜻이다. 아래 표를 보자.

 

 C declaration

32-bit 

64-bit 

 char

 1

 1

 short int

 2

 2

 int

 4

 4

 long int

 4

 8

 long long int

 8

 8

 char *

 4

 8

 float

 4

 4

 double

 8

 8

(단위 : 바이트)

 

보다시피 32비트 환경에서는 거의 다 4바이트로 표현 가능하지만 8비트짜리도 있다. 8바이트 짜리는 4바이트짜리 두개를 이어서 더욱 큰 숫자를 표현한 것이라고 생각하면 된다. 중요한 것은 char * 변수의 크기를 보자. 32비트에서는 4바이트, 64비트에서는 8바이트이다. 포인터값은 알다시피 주소값이다. 주소값이 32비트에서는 4바이트 64비트에서는 8바이트로 표현가능하다는 말이다. 다른 말로 말하면, 32비트에서는 2의 32승개의 주소 값을 표현할 수 있고 64비트에서는 2의 64승개의 주소 값을 표현할 수 있다는 말이 된다. (00...00 ~ 11...11 과 같이)

 

잠깐만 다른 이야기를 해보자.

 

08048394:    55                    push %ebp

08048395:    89 e5                movl %esp, %ebp

08048397:    8b 45 0c            mobl 0xc(%ebp), %eax

...

 

하나의 프로그램(*.c) 파일이 컴파일이 되면 대략 위와 같은 assembly code로 바뀌게 된다. 저 코드 중에서 가장 왼쪽에 있는 열이 무엇을 의미하는가? 저 부분이 virtual address이다. 실제로 컴퓨터의 physical한 메모리가 아니다. 아무튼 프로그램은 저 virtual address를 이용한다. 저 주소의 최소값은 00000000이고 최대값은 FFFFFFFF이다. 즉, 32비트이다. (32비트 환경에서는...)

 

다른 말로 말하면 한 프로그램이 가질 수 있는 크기는 0xFFFFFFFF개(2의 32승개) x 1byte = 4GB를 넘을 수 없다는 이야기가 나온다. (여기서 왜 1byte를 곱하는지는 위에 설명한 바이트의 정의를 생각해보면 알 수 있다.)

 

다시 본론으로 돌아와서 :-)

 

Char *이든 int *이든 어떤 형태의 포인터도 그것은 32비트에서는 4바이트 64비트에서는 8바이트이다. 왜냐하면 포인터는 주소값을 표현해주는 변수이기 때문이다.

 

이러한 32비트의 바이너리 표현을 컴퓨터는 어떻게 적을까? 여기에서 Little Endian, Big Endian 개념이 나온다.

0x01234567라는 32비트 숫자가 있다고 해보자.

Little Endian에서는 01 23 45 67 과 같이 표현되고

Big Endian에서는 67 45 23 01 과 같이 표현된다고 한다.

 

우리가 흔히 사용하는 Intel Micro Processor는 Little Endian을 사용한다. 왜 이렇게 썼을까? 이유라기 보다는 어느 정도의 추측은 할 수 있어야 한다고 한다. 왜인지는 나도 잘 모르겠다;;;;

 

다음 포스팅에서는 비트를 표현하는 방법에 대해서 이야기해보도록 하자.

'System Programming' 카테고리의 다른 글

[SP] Virtual Memory (Basic Knowledge)  (1) 2013.04.23
[SP] Virtual Memory (Basic Knowledge)  (6) 2013.04.23
[SP] Floating Point Number  (0) 2013.04.15
[SP] Data Representation (2's complement)  (0) 2013.04.11
[SP] 시작해보며...  (0) 2013.04.06
Posted by 빛나유
,