2011년 10월 28일 금요일

shift 연산과 byte order


shift 연산 (<< 또는 >>) 을 사용할 때는 byte order (big endian 또는 little endian) 에 상관없이 big endian 처럼 작동한다.

shift 연산은 데이터 저장 형태를 갖고 계산하는 것이 아니라 값으로 계산을 하기 때문이다.

예를 들어 정수 1이 big endian 에서는 binary 로 00 01 이고 little endian 은 binary 로 01 00 으로 저장이 될 테지만 shift 연산은 byte order 에 상관 없이 big endian 처럼 작동한다.

예)
((0x1234 >> 8) & 0xff) 은 byte order 에 상관없이 0x12 이다.

고로 시스템의 byte order 를 검사할때는 shift 연산으로 확인할 수 없다.
그래서 아래 예와 같이 shift 연산을 사용하지 않고 검사하거나 해야 한다.

예)
int a = 0x00000001;
if (((char*)&a)[0] == 1) {
 // little endian
} else {
 // big endian
}

그리고 shift 연산자 사용할 때는 byte order 에 따른 작업 분기를 할 필요없다.
아래 예와 같은 작업 분기 말이다. 오히려 낭패 본다.

예)
#if BYTE_ORDER == BIG_ENDIAN
 // big endian 연산
#else
 // little endian 연산
#endif


기본인 듯 하면서도 막상 실전에서 실수한다.

댓글 없음:

댓글 쓰기