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
기본인 듯 하면서도 막상 실전에서 실수한다.
댓글 없음:
댓글 쓰기