왕초보 질문입니다. - - ;;;
글쓴이: 하하 / 작성시간: 화, 2003/12/09 - 6:17오후
아래 코드는 왜 big endian 머신과 little endian 머신에서 동일한
결과 값을 출력할까요?????
암만 생각해도 답이 안나와 이곳 kldp에 물어봅니다.
감사합니다.....
main() { unsigned short int source; unsigned short int conv = 0; source = 333; conv = (source & 0xff00) >> 8; conv |= (source & 0x00ff) << 8; printf(" source : %d \n", source); printf(" conv : %d \n", conv); }
Forums:
[code:1]conv = (source & 0xff00&
위코드는 결국 source 의 두 바이트의 위치를 서로 swap하는 역활을 하는 코드입니다.
big endian환경에서, source의 첫번째, 두번째 byte의 값이 각각 A, B라 가정하면,
위의 코드를 수행한, conv의 값은 BA의 값을 가지게 됩니다..
이를 little endian 환경에서도 똑같이 적용하게 되면, conv의 값은 AB값을 가지게 됩니다..
따라서, endian 환경에 상관없이 출력값은 서로 같게 되는겁니다..
--------------------------
Donghyun Jung
지난번 big/little endian 질문 올리신 분이군요.저번
지난번 big/little endian 질문 올리신 분이군요.
저번에 말씀 드린 것처럼 big/little endian은 하드웨어 차원의 문제입니다. 즉 byte 열들을 직접 메모리로 입출력을 하기 위한 것이 아니라면 전혀 신경을 쓰실 필요가 없습니다.
C는 hi-level language입니다. 말씀 하신 코드는 전혀 endian과 관련이 없습니다. 0xff00 이든 0x00ff 이든 이것과 shift 연산을 하든 이것은 C 자체의 논리적인 공간(?) 내에서 표현이 되기 때문이고요, 이 논리적인 표현을 real code로 구현하는 것은 컴파일러와 하드웨어 문제입니다.
shift 연산이나 사칙연산(+ - * /)이나 마찬가지입니다. 이 연산은 C의 논리적인 공간에서 수행되는 별개의 영역입니다. 만약 이들 결과 값이 하드웨어의 big/little endian에 따라 달라진다면 엄청난 혼란이 오겠지요.
다시 말씀드리지만 메모리를 직접적으로 다루는 (pointer도 관련되겠지요) 상황이 아니라면 endian은 신경쓰실 필요가 전혀 없습니다. 따라서 위의 코드는 어떤 기계이든 똑같은 결과를 내는 것이지요.
마치 1000+2000가 3000이라는 것을 big/little endian machine이 같은 결과값을 출력하는 것처럼요.
감사합니다.. ^^;;문제는 %d로 찍어서 그렇게 똑같이 보였던
감사합니다.. ^^;;
문제는 %d로 찍어서 그렇게 똑같이 보였던 거군요...
......
“바람에게도 길은 있다. 나는 비로소 나의 길을 가느니. 길은 언제나 어디에나 있다.”
댓글 달기