April 15th, 2009
2의 보수(two’s complement)

binary

주변에 공무원 준비하는 사람이 있어서 전산학 기초를 잠시..

컴퓨터로 정수(integer)를 나타내는 방법은 그냥 2진수를 쓰면된다.
단, 양수인 경우만(데이터 타입이 unsigned일때)..

음수의 개념을 발견한건 사람한테도 비극이지만 이 개념을 컴퓨터로 옮기는데 또 한번의 시련이 온다.

음수, 별거 있나? 까지꺼 맨 앞 비트를 안 쓰기로 하고 대신 음수일때 표시를 위해 ‘1′을 주기로 하자.
즉, 8비트 자료형(byte)을 예로들면 원래 2^8=256가지 경우를 나타낼 수 있는데 1~256보다는 ‘0′도 쓰고 싶으니 0~255 까지의 값을 할당할 수 있다.
이번엔 음수를 표현가능하게 하기 위해 앞에 1비트를 사용하면 나머지 7비트만 사용 가능하니 크기(amount)는 2^7=128 가지가 사용가능하다. 즉, 0~127까지 나타낼 수 있다. 부호비트에 1을 주면 -127~-0 까지 표현 가능하다.
위의 방법이 가장 원초적으로 음수를 표현할 수 있는 방법이고 이를 ‘1의 보수’ 방법이라고 부른다.

난 ‘1의 보수’방식이 참 좋은데 ‘0 [00000000]’과 ‘-0 [10000000]’이 존재한다는 꼴(수학적으로는 의미가 없는)을 보기가 싫은 모양인가 보다. 그래서 ‘-0′을 안 쓰는 방법이 현대 컴퓨터에서 사용되는 ‘2의 보수’방법이다.
음수로도 128가지를 표현할 수 있기 때문에 ‘-0′이 하나 빠졌으니 대신 ‘-128′도 표현이 가능해 진다.
이를 ‘2의 보수’라 부르고 따라서 signed 자료형의 표현범위는 음수쪽이 양수쪽 보다 하나 더 크다(byte의 경우 -128~127).