2의 보수(--補數, 영어: two's complement)란 어떤 수를 커다란 2의 제곱수에서 빼서 얻은 이진수이다. 2의 보수는 대부분의 산술연산에서 원래 숫자의 음수처럼 취급된다. 주어진 이진수보다 한 자리 높고 가장 높은 자리가 1이며 나머지가 0인 수에서 주어진 수를 빼서 얻은 수가 2의 보수이다. 혹은 주어진 이진수의 모든 자리의 숫자를 반전(0을 1로, 1을 0으로)시킨 뒤 여기에 1을 더하면 2의 보수를 얻을 수 있다.

예시 편집

8자리의 이진수 01001011(십진수로 75)의 2의 보수를 구하면 아래와 같다.

    100000000 (8+1=9자리) --> 256
  -) 01001011 (8자리) ---> 75
  -----------
     10110101 (8자리) ---> 181

1의 보수를 이용하여 2의 보수를 구하면 아래와 같다.

     01001011 의 모든 자리의 수를 반전시킨다.
     10110100 (이것을 1의 보수라고 부른다)
              여기에 1을 더한다.
     10110100 ---> 180
  +) 00000001 ---> 1
  -----------
     10110101 ---> 181

보수를 구하며 한 자리가 더 길어진 경우에는 가장 높은 자리의 숫자를 버린다.

2의 보수를 이용한 뺄셈 편집

100-75는 100+(-75)와 같으므로

      01100100
   +) 10110101
  -----------
     100011001

새로 생긴 가장 높은 자리의 숫자를 빼고 남은 00011001은 십진수로 25와 같으며 이는 계산하려던 식의 결과이다.

2의 보수에서는 가장 높은 자리에서 자리 올림이 발생시 무시하므로 1의 보수보다 계산이 간단하다.

컴퓨터에서의 2의 보수 편집

컴퓨터(CPU)를 구성하는 가장 중요한 요소는 레지스터와 ALU인데, 정수형 처리는 ALU에서 이루어진다. 레지스터도 그렇고 ALU도 그렇고 설계 상 비트수를 결정하고 만들어야 한다. CPU의 비트수 제한으로 인해 이진법 계산의 적용에서 비트를 벗어나면 버리게 된다.

CPU는 4비트부터 시작했지만, 사용은 주로 8비트와 32비트 이상을 많이 사용한다. 16비트도 있지만 시장점유율이 그리 높지 않다. 2의 보수를 적용할 때, 프로그램에서 부호를 지정하는 변수를 사용함으로써 구현할 수 있다.

C 프로그래밍 언어에서 2의 보수 편집

   char chr;
   chr = -3;
   chr += 4;
   int inum = -7;

여기서 char는 8비트 정수형 변수이다. 정수형인데 unsigned 키워드를 사용하지 않았으므로 부호를 갖는 정수형 변수이다.

-3은 컴파일러가 다음과 같이 이진수로 바꾸어 기계어 코드와 결합 한다.

    . 00000011 (+3  - 8자리)
    . 11111100 (3의 1의 보수)
   +) 00000001 (1 더하기)
    -----------
      11111101 (-3)

C언어에서 -3까지의 이진수 변환은 컴파일러가 한다. CPU내부에서 3을 -3으로 변환하는 것이 아니다. 'chr += 4;' 연산은 ALU에서 하는데, 다음과 같이 이진수로 나타낼 수 있다.

    . 11111101 (-3)
   +) 00000100 (4 더하기)
    -----------
    1 00000001 (1)

여기서 MSB의 1은 버리고 8비트만 레지스터 저장한다. 이렇게 ALU을 계산할 때, 8자리에서 9자리로 넘어가는 이진수를 Carry라고 하고 CPU 레지스터 중에 Flag 레지스터에 저장 하여 올림이 되었는가를 저장한다. 결국 최종 계산 값은 00000001이 된다.

int 변수는 16/32비트를 사용하도록 하는 변수 인데, 32비트 예를 들면 다음과 같다.

    . 00000000000000000000000000000111 (+7 : 32자리)
    . 11111111111111111111111111111000 (7의 1의 보수)
   +) 00000000000000000000000000000001 (7의 '1의 보수' + 1 : 더하기)
    ----------------------------------
      11111111111111111111111111111001 (-7)

자바에서 2의 보수 편집

자바는 특정 CPU와 관계 없기 때문에 변수에 따라 비트수가 결정되어 있다.

   byte : 8비트 정수형
   short : 16비트 정수형
   int : 32비트 정수형
   long : 64비트 정수형

자바에서의 byte는 C언어의 char와 같다. 이 비트 한계에서 이진수가 취급되고 만약 숫자 연산에서 자릿수가 벗어나면 C언어처럼 버린다.

같이 보기 편집