본문 바로가기

프로그래밍/논리회로

[논리회로] 부호 절대값, 1의 보수, 2의 보수와 부호 확장 (Sign and magnitude form & 1's complement / 2's complement & Sign extension)

[Digital Systems] p363-367

 

https://midoriprogramming.tistory.com/4

 

[논리회로] 10진수에서 2진수로 전환하는 방법 (Decimal to Binary Conversion), Repeated Division

[Digital Systems] p59-60 https://midoriprogramming.tistory.com/3 [논리회로] 2진수에서 10진수로 전환하는 방법 (Binary to Decimal Conversion) [Digital Systems] p.58 https://midoriprogramming.tistory.c..

midoriprogramming.tistory.com

 

지난 시간에 10진수를 2진수로 전환하는 방법에 대해서 알아봤다.

 

이번에는 부호 절대값, 1의 보수, 2의 보수, 부호 확장에 대해서 알아보겠다.

 

 

 

○ 부호 절대값 형태 (Sign and magnitude form)

 

여분의 부호 비트를 추가해서 부호 + 또는 - 를 나타내는 방법이다.

 

 

부호 비트(Sign bit)가 0이면 양수(+)를, 1이면 음수(-)를 나타낸다.

 

 

※ Sign-Magnitude로 표시된 4bit 정수

4bit의 경우 부호가 없는 경우 총 16개의 정수를 나타낼 수 있었다.

 

하지만 Sign-Magnitude로 표기하면 0이 중복되어서 총 15개의 정수만 나타낼 수 있다는 문제점이 있다.

 

즉, 낭비가 있다.

 

 

 

 

 

 

○ 1의 보수 형태 (1's complement form)

 

 

비트를 뒤집으면 음수가 되는 형태가 1의 보수다

 

 

위 그림과 같이 01011011(+91)의 비트를 모두 뒤집으면 10100100(-91) 음수가 된다.

 

 

※ One's Complement로 표시된 4bit 정수

 

 

4bit의 경우 부호가 없는 경우 총 16개의 정수를 나타낼 수 있었다.

 

하지만 1의 보수로 표기하면 앞의 부호 절대값 형태와 같이 0이 중복되어서

총 15개의 정수만 나타낼 수 있다는 문제점이 있다.

 

즉, 표현하는 방법만 다르지 0이 중복되어서 낭비가 된다는 점은 똑같다.

 

 

 

 

 

 

○ 2의 보수 형태 (2's complement form)

 

 

2의 보수 시스템은 가장 많이 숫자를 나타내는 방법이다.

 

2진수를 2의 보수 형태로 바꾸는 방법은 다음과 같다.

 

  1. 각각의 비트를 뒤집어 준다 (0→1, 1→0) (Change each bit to its complement)
  2. 1을 더해준다 (Add 1)

 

1의 보수와 비슷하다. 1의 보수처럼 비트를 뒤집어준 다음 1을 더해주기만 하면 된다.

 

위 그림과 같이 01011011(+91)의 비트를 모두 뒤집어준 뒤 1을 더하면 10100101(-91) 음수가 된다.

 

 

※ Two's Complement로 표시된 4bit 정수

 

 

부호 절대값 형태와 1의 보수와는 다르게 중복되어 낭비되는 비트가 없다.

 

또한 음수와 양수의 표현 범위가 다르다는 것을 알 수 있다.

 

위의 4bit의 경우 -8 ~ +7까지 표시할 수 있는데

 

이를 수식화하면 N개의 비트에서는

이런 범위를 나타낸다는 것을 알 수 있다.

 

 

 

 

 

○ 부호 확장 (Sign Extension)

 

시스템에 따라서 숫자를 나타내는 bit의 길이를 변경할 수 있다.

 

예를 들어 char(8bit) 에서 short(16bit)로 전환한다면 sign bit를 늘려야한다.

 

  • sign bit를 반복하여 추가한다.

 

● 예시

 

5bit 숫자를 8bit 숫자로 늘리는 경우

 

※ 양수

양수에서는 Sing bit가 0이므로 앞에 0을 3개 붙여서 8bit로 확장한다.

 

 

※ 음수

 

음수에서는 Sign bit가 1이므로 앞에 1을 3개 붙여서 8bit로 확장한다.

 

간혹 음수에서 Sign bit가 1임에도 0을 붙여서 확장하는 실수를 하는 경우가 많으니 조심하자

 

 

 

 

○ 타입 축소 (Converting to smaller integer type)

 

위 부호확장과는 반대로 긴 길이의 숫자를 짧은 길이의 숫자로 변경시는 상위 비트를 제거하면 된다.

 

● 예시

 

 

물론 부호 확장된 부분을 제거하는 것이 아닌 경우

 

즉, 값이 짧은 길이의 숫자의 표현 가능 범위를 넘어 서면 당연히 숫자가 완전히 달라지는 오류가 나니 조심해야한다.