Bic endian, Little endian 알아볼때..
글쓴이: boardholic / 작성시간: 목, 2005/07/14 - 9:34오후
int main(void) { unsigned int a=0x01020304; printf("%x\n", *(unsigned char*)&a); printf("%x\n", *(unsigned short*)&a); printf("%x\n", *(unsigned int*)&a); return 0; }
여기서 *(unsigned char*)&a 이 의미가 잘 이해가 안갑니다.
(unsigned char)a라고 해도 값은 같은거 같은데 구지 *형으로
변환을 해서 하는 이유는 무엇입니까?
[/code]
Forums:
위 소스결과[code:1]43041020304[/cod
위 소스결과
님 말씀대로 했을 때 결과
Little Endian 컴퓨터와 Big Endian 컴퓨터간에 floa
Little Endian 컴퓨터와 Big Endian 컴퓨터간에 float형 데이터 전송을 예로 들면 이해가 되실듯 합니다.
만약 float 데이터를 질문자님께서 하신거와 같이 (int)xxx.xx 로 변환하면... 원래 데이터의 비트 값에 변화가 생깁니다.
소수점 처리를 위해서겠죠?
그러나 *(unsigned int*)&float_val 과 같이하시면... 원래 데이터의 비트값에 변화를 주지않고.. htonl 또는 shift와 같은 연산을 통해 바이트 오더를 맞출 수 있습니다.
수신측에서도 위와같이 포인터를 이용한 형변환을 하시면.. 원래의 부동소수점 데이터를 받을 수 있습니다.
Re: Bic endian, Little endian 알아볼때..
실제로 메모리에 a가 저장되는 모습을 살펴 봅시다. 만약 big endian이라면...
01 02 03 04
식으로 저장될 것이고, little endian이라면....
04 03 02 01
이렇게 저장될 것입니다. 편의상 맨 처음 바이트의 주소를 0x100이라고 하겠습니다.
(unsigned char)라고 막바로 casting을 하면, 자리값이 작은 8비트만을 잘라 내서 반환합니다. 이 작업은 당연히 big endian이나 little endian이나 똑같이 0x04가 나올 것입니다. (어느 위치에 저장되든 자릿값이 가장 작은 8비트는 0x04니까) 그냥 간단하게 생각하시려면 256으로 나눈 나머지라고 생각하셔도 될 듯 하네요.
하지만 이렇게 하는 건 우리가 원하는 게 아닙니다. 우리는 실제로 메모리 상에 저장되는 모습을 알고 싶은 거죠. 따라서 포인터를 사용해서 "메모리 상에서 맨 처음에 들어 오는 바이트"가 무엇인 지 확인하게 됩니다. a라는 포인터가 unsigned int 형이면 4바이트를 통째로 묶어서 연산을 하기 때문에 알 방법이 별로 없지만, unsigned char 형이라면 1바이트 단위로 연산을 하기 때문에 같은 곳을 가리키더라도 다른 값을 나타내게 됩니다. 앞에서 말했듯이 &a == 0x100이라고 하면, a는 0x100부터 4바이트를 가져 온 0x01020304지만, *(unsigned char*)&a는 0x100 위치에 있는 바이트 하나만 해당되는 0x01 또는 0x04가 됩니다. 이 차이를 이용해서 byte order를 결정할 수 있겠죠.
- 토끼군
댓글 달기