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 비트 연산에서는 부호 없는 타입을 사용한다.