더북(TheBook)

첫 번째와 두 번째는 초창기에 사용하던 방식으로 요즘엔 거의 안 쓴다. 부호와 크기 방식에서 크기 비트는 양의 값을 표현하고, 부호 비트는 음수 부호의 존재 여부만 지정한다. 1의 보수 방식은 양수 값에 해당하는 비트 전체에 대해 보수(complement)를 구한다. 두 표현 방식 모두 양수 0과 음수 0을 구분할 수 없다는 단점이 있다.10

최신 플랫폼은 대부분 2의 보수 표현을 사용한다. 이 방식은 앞에서 봤던 부호 없는 타입에 대한 산술 연산을 그대로 따르면서, 부호 없는 값의 범위에서 상위 절반(가장 높은 비트가 1인 값들)을 음수로 해석한다. 이러한 부호 없는 값을 부호 있는 값으로 해석하기 위해서는 다음 두 함수만 있으면 된다.

boo is_negative(unsigned a) {
  unsigned const int_max = UINT_MAX/2;
  return a > int_max;
}
bool is_signed_less(unsigned a, unsigned b) {
  if (is_negative(b) && !is_negative(a)) return false;
  else return a < b;
}

표 5-7은 예제에 나온 240이란 값을 음수로 만드는 과정을 보여 준다. 부호 없는 타입에서 -A~A + 1이다.Exs 12, Exs 13, Exs 14 2의 보수 표현에서 부호 있는 타입에 대한 비트 연산은 부호 없는 타입과 똑같다. 단지 높은 자리 비트(high-order bit)를 음수로 해석할 뿐이다.

 

 


Exs 12 부호 없는 산술식에서 A + ~A가 최댓값임을 증명해 보자.

Exs 13 부호 없는 산술식에서 A + ~A가 -1임을 증명해 보자.

Exs 14 부호 없는 산술식에서 A + (~A + 1) == 0임을 증명해 보자.

 

 


10 최신 아키텍처에서는 두 가지 0을 구분할 필요가 없기 때문에 C 표준의 다음 버전에서 이 부분을 삭제하는 작업을 진행하고 있다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.