본문 바로가기

Computer Science

1장. 정수를 비트로 표현하는 방법

728x90
한 권으로 읽는 컴퓨터 구조와 프로그래밍을 읽고 스터디를 위해 이해한대로 정리한 글입니다.😀

 

정수를 비트로 표현하는 방법

 

비트를 사용해 수를 표현하는 방법을 알아보자.

 

우리가 보통 수를 표현할 때 10진수 체계를 사용한다. 우리의 손가락과 발가락이 10개이기 때문이다. 10진수 체계에서는 0,1,2,3,4,5,6,7,8,9 처럼 기호이면 숫자 10가지를 사용한다. 그리고 우리는 이걸 상자 안에 담아 볼 수 있다. 상자는 오른쪽부터 왼쪽으로 쌓여간다. 맨 오른쪽은 일의 자리, 오른쪽에서 두 번째는 십의 자리, 세 번째 자리는 백의 자리 이런식이다. 즉, 각각의 이름은 10의 거듭제곱으로 볼 수 있다. 10의 0 승(10^0)은 1, 즉 1의 자리, 10의 1승은 10, 10의 자리 이렇게 쭉쭉쭉쭉 이어지는 것이다. 이 10진수 체계는 지수를 적용할 밑으로 10을 사용하기 때문에 밑이 10인 시스템(영어로는 base-10)이라고도 부른다.

 

 

그림의 예처럼 5028이라는 10진수는 5와 1000의 곱, 0과 100의 곱, 2와 10의 곱, 8과 1의 곱을 합한 값을 표현한다. 이것을 수식으로 쓰면 (5 * 10^3) + (0 * 10^2) + (2 * 10^1) + (8 * 10^0)과 같다.

 

그러면 만약 비트를 사용해서 값을 정할 때는 어떻게 되는 것일까? 비트는 기호이면서 숫자인 1,0 두개를 사용한다. 여기서 상자를 예를 들어보자. 다시 10진수 상자로 와본다. 10진수에서 9일 때는 1의 자리, 10일 때는 10의 자리이다. 9까지는 맨 오른쪽 한 가지 상자로만 가능했지만, 10은 오른쪽에서 두 번째 자리에 상자가 하나 추가되었다. 0~9까지는 상자하나로 표현이 가능하지만 10부터는 상자 하나가 더 필요한 것이다. 이 원리는 비트, 즉 2진수에서도 마찬가지이다. 0~1까지는 상자하나로 표현이 가능하지만, 2부터는 상자 하나가 더 필요하다. 그럼 이 상자는 2의 자리라고 부를 수 있다. 다시 10진수로 돌아가보면, 10진수 체계에서 어떤 상자가 표현하는 값은 그 오른쪽 상자에 10을 곱한 값이었다. 100의 자리, 10의 자리, 1의 자리. 2진수 체계에서도 같은 원리다. 2진수에서는 2를 곱한 값이다. 8의자리, 4의자리, 2의 자리, 1의 자리. 이런식이다. 따라서 각 상자의 자릿수는 2의 거듭제곱이며, 2를 밑으로 하는 수 체계이다. 

 

 

5028을 2진 표현법으로 표현한 것이다 (1 * 2^12) +  (0 * 2^11)... 이어서 쭉... 이렇게 모여 1001110100100이라는 2진수를 이룬다. 10진수에서 했던 계산과 마찬가지로  4096+ 512+ 256 + 128 + 32 + 4 = 결국 5028. 계산을 통해 2진수가 표현하는 값을 알 수 있다. 

 

10진수에서는 5028이 네자리 숫자라고 말 할 수 있고, 2진수로는 1001110100100 즉, 13비트 수가 된다. 

 

5028을 2진수로 표현해 놓은 것이다. 여기서 가장 오른쪽의 비트를 '가장 작은 유효 비트(List Significant Bit)' 가장 왼쪽의 비트를 '가장 큰 유효 비트(most significant)라고 부른다. 가장 오른쪽의 비트를 변경하면 2진수의 값이 가장 작게 변경되고 가장 왼쪽의 비트를 변경하면 가장 크게 변하기 때문이다.

 

아까 5028을 2진수로 표현했을 때 2진수로는 1001110100100 즉, 13비트였다. 그런데 그림 1-7을 보면 15비트이다. 갑자기 왜 달라진걸까. 10진수로 돌아와보자. 05028과 5028은 같은 수이다. 이렇게 가장 왼쪽에 있는 상자보다 더 왼쪽에 0을 추가하면 상자를 더 많이 추가할 수 있다. 그리고 이 추가된 왼쪽의 0들을 리딩 제로(leading zero)라고 한다. 컴퓨터는 미리 정해진 수의 비트를 한 덩어리로 사용하기로 약속하였다. 때문에 이 정해진 수를 맞추기 위해 왼쪽 상자에 0을 추가하여 값을 표현하는 경우가 종종있다. 

 

 

 

정수를 비트로 표현하는 방법

 

양의 정수 표현

우리는 보통 1,2,3,4,5,6,7,8,9 같은 숫자체계를 사용하는데 이를 10진수 체계라고 합니다. 그리고 우리는 보통 오른쪽부터 왼쪽으로 일의자리, 10의 자리, 100의자리 이런식으로 부릅니다. 각 자리의 이름은 10의 거듭제곱인 것입니다.

 

 

이 그림을 보면 5028을 10진수로 나타내본 것입니다. 

 

비트를 사용할 때도 이와 비슷하게 접근할 수 있습니다. 비트는 0,1 이라는 숫자체계를 사용하는데 이를 2진수 체계라고 합니다. 그리고 오른쪽부터 왼쪽으로 1의 자리, 2의 자리, 4의 자리 순 입니다. 각 자리의 이름은 2의 거듭제곱인 것입니다. 

 

이 그림은 5028을 2진수로 나타내본 것입니다. 

 

10진수와 2진수 모두 5028이지만 표현하는 방식이 다른 것을 볼 수 있습니다. 10진수에서는 말 그대로 5028, 네 자리 숫자라고 말 할 수 있습니다. 그리고 위 그림에서 보시면 2진수 표현으로는 1001110100100, 13비트 수라고 할 수 있습니다.

 

위 그림을 보시면 가장 큰 유효 비트(most significant bit)와 가장 작은 유효 비트(least fisnigicant bi)라고 나와 있습니다. 이는 가장 오른쪽의 비트를 변경하면 2진수의 값이 가장 작게 변경되고 가장 왼쪽의 비트를 변경하면 2진수의 값이 가장 크기 때문에 이렇게 사용한다고 합니다. 보통은 MSB, LSB로 줄여서 부릅니다.

 

자, 여기서 아까 5028은 13비트라고 했는데 위 그림은 15비트입니다. 보통 10진수에서도 5028과 05028은 같습니다. 이렇게 왼쪽에 0이 추가 된 것을 리딩제로(leading zero)라고 부르는데요. 왜 0을 앞에 추가했을까요. 컴퓨터의 약속 때문입니다. 미리 정해진 수의 비트를 사용하기로 약속했기 때문에 그것을 맞추기 위해 의미없는 0을 앞에 추가해주었습니다.

 

2진수 덧셈

2진수의 덧셈에서는 논리 연산을 사용할 수 있습니다. 2진수 A와 B를 더해봅시다. 왼쪽부터 세 번째 칸에 'A AND B'와, 오른쪽부터 세 번째 같에 'A XOR B' 가 보이실 겁니다. 이것을 차례대로 'A AND B'를 1의자리, 'A XOR B'를 2의자리로 더해줍니다. 'A + B'의 첫 번째 줄을 보시면 양옆에서 숫자를 가져와 00으로 되어있는 것을 볼 수 있습니다.

2진수의 덧셈에서는 논리 연산을 사용할 수 있습니다. 2진수 A와 B를 더해봅시다. 왼쪽부터 세 번째 칸에 'A AND B'와, 오른쪽부터 세 번째 같에 'A XOR B' 가 보이실 겁니다. 이것을 차례대로 'A AND B' 에 있는 숫자와, 'A XOR B'에 있는 숫자를 합쳐줍니다. 'A + B'의 첫 번째 줄을 보시면 양옆에서 숫자를 가져와 00으로 되어있는 것을 볼 수 있습니다.

음수 표현

이번에는 음수표현에 대해서 알아보겠습니다. 2진수에서 음수를 표현하는 방법은 세 가지가 있습니다.

부호와 크기 방법, 1의 보수 방법, 2의 보수 방법이 있습니다.

 

부호와 크기 방법 먼저 살펴보겠습니다.

 

부호와 크기에서는 비트 중에 한 자리를 부호의 공간으로 사용하기로 했습니다. 따라서 부호 부분만 양수, 음수인지에 따라서 양수일 경우 0, 음수일 경우 1을 사용해줍니다. 그리고 나머지 부분은 같습니다.

 

 

1의 보수 방법에서는 양수의 모든 비트를 뒤집어 음수로 표현해줍니다.

 

2의 보수 방법에서는 양수의 모든 비트를 뒤집고, 여기에 1을 더해줍니다. 만약 0110 을 1001으로 뒤집는다고 가정해봅시다. 그리고 여기에 1을 추가해야겠죠. 답은 1002가 아닙니다. 왜 1002가 아닐까요? 다시 한 번 말해보자면 2진수는 숫자 0,1만 사용합니다. 따라서 1001에서 1을 더한다면 1010이됩니다. 왜냐하면 '1001'이었던 것에 즉, 마지막 자리만 보자면 (2^0 = 1)에 (2^0 = 1)을 추가해서 (2^1 = 2)로 숫자 올림이 되었기 때문이다. 

 

이렇게 정수를 비트로 표현하는 방법에 대해 알아보았습니다.

728x90