블로그 이미지
송시혁

calendar

1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30

Notice

Tag

Recent Post

Recent Comment

Recent Trackback

Archive

10000.625가 있다.

10000을 2진수로 변환한다=  10 0111 0001 0000

0.625를 2진수로 바꾼다. 0.625*2 = 1.250 앞에 있는 1을 가져온다

0.250 * 2 = 0.500  0을 가져온다.

0.500 *2 = 1.000,  1을 가져온다.

101이 된다. 앞에 정수 10000의 2진수와  같이 쓰면 10 0111 0001 0000.101이된다. 아래여러 그림이 있지만

32비트 단정도를 참고한다.

 

 

그림에서 s = 부호이다. 1이면 -, 0이면 +

지수부

10 0111 0001 0000.101에서 소수점을 제일 앞1뒤까지 옮긴다. 그러면

1.0 0111 0001 0000 101이 된다. 점을 세보면 13칸을 이동했다.

이것이 포인트

수직선에 127(0~255에서 반으로 나눈 기준 0이된다.)을 기준으로 +13을 한다면 140이 된다. 2진수로 표현하면 10001100이 된다.

양의 정수는 0이므로 이것을 지수부까지 표현하면 010001100 이된다.

그다음 가수부 23자리(23비트)를 쓰는데 1.0 0111 0001 0000 101에서 1을 제외한

나머지를 쓴다. 총32비트이므로 32자리인데 부호와 지수부에서 9자리를 써서 23자리가 남았다. 가수부에서 위의 1을 제외한 0 0111 0001 0000 101다음과 같이된다.

 

0100 0110 0001 1100 0100 0010 1 = 25자리를 차지함. 나머지 7자리가 빈다.

이경우에 7자리에 0으로 채운다. 그러면 다음과 같이 된다.

0100 0110 0001 1100 0100 0010 1000 0000이 된다.

이것을 16진수로 표현한다.

0100  = 4

0110  = 6

0001  = 1

1100  =  C

0100  =  4

001 =  2

1000  =  8

0000  =  0

46 1C 42 80이 된다. (화면상) 컴퓨터는 이값을 반대로 저장하고있다.

80 42 1C 46으로 저장되어있다.

음수는 제일 앞의 부호만 1로 바꾸면 된다.

 

아래는 관련소스와 출력화면.

#include <stdio.h>
int main()
{
  float fNum;
  unsigned char *ucp;
  
  ucp = (unsigned char*)&fNum;
  fNum = 10000.625f;
  
  printf("%02x %02x %02x %02x\n", *(ucp + 0), *(ucp +1), *(ucp +2), *(ucp +3));


  

  return 0;

}

 

 

posted by 송시혁