더북(TheBook)

TAKEAWAY 5.59 부호 있는 산술에서 부정 연산을 수행하면 오버플로가 발생할 수 있다.

부호 있는 타입에서 비트 연산은 바이너리 표현을 기준으로 처리한다. 그래서 비트 연산의 값은 특히 부호 표현에 따라 달라진다. 실제로 비트 연산으로 부호 표현을 감지할 수도 있다.

char const* sign_rep[4] =
{
  [1] = "sign and magnitude",
  [2] = "ones' complement",
  [3] = "two's complement",
  [0] = "weird",
};
enum { sign_magic = -1&3, };
...
printf("Sign representation: %s.\n", sign_rep[sign_magic]);

시프트 연산을 사용하다 보면 코드가 금세 지저분해진다. 음수에 대한 시프트 연산을 수행할 때의 의미가 불분명하기 때문이다.

TAKEAWAY 5.60 비트 연산에서는 부호 없는 타입을 사용한다.