2의 保守

위키百科, 우리 모두의 百科事典.

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言語처럼 버린다.

같이 보기 [ 編輯 ]