Bitaholic

Bit & Binary 두번째 이야기 본문

Computer/Basic

Bit & Binary 두번째 이야기

Bitaholic 2009. 3. 20. 12:44
 
이번글은 저번글에 이어 그럼 비트 스트링을 이용해서 무엇을 표현 할 수 있는지 알아보겠다.

'101011101' 이런 비트 스트링을 이용해서 컴퓨터에서 무엇을 표현할 수 있을까?
답은 표현할수 있는건 모든지 할 수 있다. ㅎㅎ
가장 만저 비트 스트링 자체가 2진수 숫자이기 때문에 "수"를 표현 할 수 있을테고, 또한 문자코드를 이용해 문자도 표현할 수 있다.(이건 나중에 다시 글을 쓸 예정이다), 또한 옆의 사진 같은 사진이나 사운드 영상 등 표현할 수 있는 것이 많다.

이번 글은 비트스트링의 가장 기본인 수를 표현 하고 다루는 것에 대해 써볼 것이다.
먼저 자연수 0~무한대까지 (컴퓨터 용량이 허용하는데까지)를 표현 할수 있고 4칙연산도 가능하다. 2진수 1010 은 10진수 10에 해당한다. 이런식으로 비트 스트링으로 자연수를 표현 할 수 있다.

그럼 음의 정수 는 어떻게 표현할까? 비트스트링에 허용된 문자는 '0' 과 '1' 밖에 안되기 때문에 '-01010' 과 같이 실생활에서 쓰듯이 '-' 문자를 이용해서 컴퓨터에선 표현을 할 수 없다. (앞에 글에서도 설명했 듯이 컴퓨터가 최소로 표현할 수 있는 단위는 bit이고 bit는 두가지 값만 가질 수 있는데 컴퓨터는 이 2가지 값을 '0' 과 '1'로 표현을 하기 때문이다) 

 보수 (Complementary)
그렇다면 어떻게 표현을 할까? 바로 영어로는 complementary라고 하는 보수로 이 음수를 표현을 한다. 각 진수에는 2가지 보수가 있는데 
  • n 의 보수
  • n-1의 보수
두가지가 있다 예를 들어 10진수에서의 'n의 보수'는 즉 '10의 보수'는 "10-n"이다. 예를 들면 10진수 4의 '10의 보수'는 6이다. 또한 10진수의 'n-1'의 보수는 즉 9의 보수는 "10-1-n"이다. 예를 들면 10진수 4의 '9의 보수'는 10-1-4 = 5이다.
이 보수의 특징은 같은 자리수의 특정 수와 그의 보수를 더하면 'n의 보수' 는 자리수를 넘는 캐리가 발생하며 모든 자리수의 값이 0으로 되고 n-1의 보수는 캐리는 발생하지 않고 모든 자리수가 9가 된다. 예를 들면 10진수 472 와 그의 10의 보수인 528을 더하면 1000 이된다. 또한 472의 9의 보수는 527를 더하면 999 가 된다. 이러한 특징을 이용하면 양의 정수만 이용해서 음의 정수까지 표현을 할 수 있게된다.

 n의 보수(10의 보수)의 연산법
   예) 483 - 321 = 162
위와 같은 수식은 10의 보수를 이용하면 
  483 + (-321) 으로 표현을 할 수 있고 321을 10의 보수로 바꾸면 679이다. 즉 483 + 679 = 1162이다 여기서 자리수를 넘어가는 캐리 1을 생략 하면 162만 남고 정확한 계산 값이 얻을 수 있다.

여기서 계산 값이 마이너스가 되는 경우는 어떻게 되는지 보면
  예) 342 - 623 = -281 식을 10 보수로 나타내면 
       342 + 377 = 719 가 된다.
       하지만 여기서 718가 양의 정수 인지 아니면 음의 정수를 보수화 시킨건지 알길이 없다.

그래서 쓰는 방법이 부호를 나타내는 자리수를 쓰는 것이다. 위의 예를 다시 한번 쓰면

  예) 342 - 623 = -281 을 부호 자리수 까지 4자리로 확장해서 쓴다. 즉 다음 과 같이
      0342 - 0623 = -0281 으 자리수를 늘리고 10의 보수화 처리를 하면
      0342 + 9377 = 9719 가 된다. 
      9719를 다시 10의 보수를 취하면 0281 즉 - 281 이다.
      우리가 확장한 맨 앞자리의 수가 0이면 양의 정수 이고 9이면 양의 정수의 보수라는 것을 알 수 있다. (저렇게 4자리수를 쓰면 맨 앞자리는 부호자리수로 써야 하기때문에 3자리수까지의 수만 처리 할수 있다.(두수의 합이 3자리수를 넘어가도 안된다)

위와 같은 방법으로 하면 정수의 + - 모두를 표현 할 수 있고 사칙 연산까지 모두 가능 하게 된다.

지금까지 10진수로 설명을 했는 데 2진수로 해도 마찬가지이다. (2의 보수 이용)
1 byte 로 표현할 수 있는 수는 2진수로 00000000 (0) ~ 11111111 (255) 이다. 여기서 HO비트를 부호비트로 쓰면 7비트만 남은깐 양수는 00000000 (0) ~ 01111111(127) 이고 음수는 11111111(-1) ~ 10000000 (-128) 을 나타낼 수 있다. 
즉 1byte로는 -128 ~ 127 까지 나타낼 수 있다. 

 2의 보수 변환법
10진수의 10의 보수는 보수를 취하려는 수자리수 보다 한자리 높은 예를 들면 742처럼 3자리의 10진수를 10의 보수를 취하려면 한자리수 높은 1000 에서 742 를 빼면 쉽게 10의 보수인 258 을 구할 수 있다 또한 9의 보수는 같은 자리수의 최대수인 999에서 742를 빼면 742의 9의 보수인 257을 쉽게 구할 수 있다.
2진수도 마찬가지로 빼면 되지만 2진수의 보수를 구하는 방법은 빼는 연산보다 더 쉬운 방법이 있다.
1의 보수는 보수를 취하려고하는 수의 자리수 최대수 예를 들어 10110011 의 같은 자리수 최대수는 11111111 이다 즉 1의 보수는 1111 - 1011 = 0100 이다. 이 수는 그냥 빼지 않아도 각 자리수 반대의 값 (1->0)으로 0->1로 바꾸어 주기만 한다. 또한 2의 보수는 10000 - 1011 = 0101 는 1011의 1의 보수에 그냥 1만 더해 주면 같은 값을 구 할수 있다. 컴퓨터에서도 "뺴는 연산" 보다 "반대값으로 변환하는 연산" 이 더 쉬운 연산이다. 

 1의 보수 vs 2의 보수 
1의 보수 (n-1)는 보수 변환이 쉽다 (그냥 반대값으로 바꾸어 주기만 하면된다) 그리고 1의 보수도 +, - 연산을 할 수 있지만 1의 보수는 연산에서 보수가 있으면 항상 결과값에 1을 더해주어야 정확한 계산이 된다. 9의 보수도 마찬가지다 
  예) 0010(2) + 1110 (-1) = 10000 = 0000 이다 .즉 여기서 1을 더해주어야 답인 0001(1)이 된다.
여기서 HO비트는 부호비트이다. 그리고 1110은 0001의 1의 보수이다.
또한 1의 보수는 0이 두개이다. 무슨말인가 하면 0000(0) 의 보수는 1111(0) 즉 둘다 +0 , -0 으 ㅣ두가지 0이 있게된다. 컴퓨터 세상에서 같은 값의 두가지 표현은 심각한 문제가 될수 있다.(특히 비교에서) 2가지 0을 같은 값으로 처리하기 위한 추가적인 연산이 필요하게 된다.
  이에 반에 2의 보수는 보수 변환 과정에 1을 더해야 하는 추가적인 연산이 필요하지만 0도 한가지이고 보수가 있는 연산에서도 계산 후 추가적인 작업이 필요없다. 그래서 보통 컴퓨터에선 2의 보수를 음수 표현식으로 쓴다.

설명을 잘 못하다보니 짧고 쉬운 내용이 엄청 길어졌다 .ㅡ,.ㅡ

다음글은 비트스트링으로 숫자가 아닌 문자 표현법에 대해서 짧게 써볼 예정이다. 끝....

Comments