|
C 언어는 저급 언어입니다.
그닥 복잡한 기능을 제공해주는 게 아니란 의미에서요.
printf("%x", *(int*)&f); 하면 제대로 나올겁니다.
float 형은 4byte짜리 자료형이죠. int도 마침 4바이트입니다.
그래서 &f 로 f의 주소를 넘기고, 주소끼리는 캐스팅이 되니까, int*로 여기게 한 다음, 그 내용을 꺼내면
int 형인듯 자연스레 넘어갑니다.
하지만 float를 바로 던질 경우 type high promotion이 발생합니다.
8byte 실수형인 double로 변해버리죠.
printf(%x %x", f); 를 해 보시면 아실 수 있을겁니다.
%x 옵션을 판독한 printf함수의 내부에서는 스택으로 전달된 인자 중 4바이트 꺼내 16진수로 출력하게 됩니다.
8바이트가 넘어갔고, 부동소수점 표현은 MSB쪽으로 유효비트가 몰려들어있기 땜에, 뒤의 4바이트에서 나오게 되는 것이죠.
물론 double형으로 늘어나면서 지수부의 비트도 살짝 변하게 됩니다.
박연규 님이 쓰신 글 :
: float f=3.5f;
:
: printf("%x",f);
:
: 찍으면 16진수로0x40600000
: 가 안나오고 0이나오네요
:
: 40600000으로 찍어내는방법은 알고있는데
:
: 실수를넣으면 왜 %x로바로 변환이안되는지 궁금하네요 자세한설명부탁드립니다.ㅠ
|