본문 바로가기

C 언어/임베디드 C

포인터(2)[IEEE754방식으로 확인]

//실수 5.765가 메모리에 저장되있는 주소를 확인하는 예문

#include <stdio.h>

int main()
{
 float f;
 unsigned char *cp;
 f = 5.765;
 cp = (unsigned char *)&f;

 printf("%02X %02X %02X %02X\n", *cp, *(cp+1), *(cp+2), *(cp+3));
 return 0;
}

결과
E1 7A B8 40

위 예문을 IEEE754방식으로 확인하기 위해 2진수로 나타내면
1110 0001 0111 1010 1011 1000 0100 0000이다.
하지만 컴퓨터는 화면과 다르게 1바이트씩 거꾸로 입력을 하기 때문에 (예를 들면 화면에는 1234라고 입력하지만 컴퓨터는 4321로 입력을 해 계산한다.) 거꾸로 나타내서 기계식으로 계산을 해야한다.
1바이트씩 거꾸로 쓰면,
0110 0000 1011 1000 0111 1010 1110 0001이다.

이제 5.765를 이진수로 표현한다.
5는 101
0.765는(0.765*2=1.530->1, 0.53*1=1.06->1, 0.06*2=0.12->0........이런식으로 계산해서 2진수를 나타냄)
1100 0011 1101 0111 0000 1..로 나타내어 진다.
합치면
101.1100 0011 1101 0111 0000 1..<--제일 앞 비트를 제외한 23비트를 구한다(가수부)
젤 앞 비트만 남기고 소수점으로 보낸다.
1.0111 0000 1111 0101 1100 001.. * 2^2(2의 2승)<--소수점이 좌로 2번 이동하여 양의 승수
bias 127+2= 129 <--지수부를 2진수로 나타내면 1000 0001
부호비트는 양수이기 때문에 0이다.

부호비트(1)
+ 지수부(8) + 가수부(23)  [괄호안에 숫자는 비트수]

0 1000 0001 0111 0000 1111 0101 1100 001

4비트씩 정리하면
0100 0000 1011 1000 0111 1010 1110 0001

16진수로 나타내면
40 B8 7A E1 <--컴퓨터가 읽어 들이는 방법

이런식으로 확인할 수 있다.


'C 언어 > 임베디드 C' 카테고리의 다른 글

주소 값의 연산  (0) 2011.04.19
포인터(3)  (0) 2011.04.18
포인터(1)  (0) 2011.04.15
구구단 출력하기  (0) 2011.04.15
gdb 명령어  (0) 2011.04.13