Qaupot Blog
Software Engineering, Trip

IEEE 754

C 언어에서 사용하는 부동소수점은 IEEE 754 표준을 따릅니다.
float의 경우 부호에 1bit, 지수부에 8bit, 가수부에 23bit를 배정합니다.
여기서 지수부는 excess 127코드를 사용합니다.

  • 예 : 2의 0승은 0111111 127, 2의 1승은 1000000 128

여기서 각 수들은 2진수이므로,
결과적으로 이 값은 가수부 * 2^(지수부)의 값을 가지게 됩니다.
이와 동시에 가수부의 가장 왼쪽의 수는 무조건 1을 가지게 되므로, 생략합니다.
(2진수에서 0을 제외한 모든 수는 정규화 했을때 1.xxx의 형태가 됩니다.)

#include <stdio.h>

int main(int argc, char** argv)
{   
    float Var = 4.0;
    unsigned char* VarToByte = (unsigned char*)&Var;
    unsigned char BinaryStringArray[33];
    int i;

    for(i=7 ; i>=0 ; i--)
    {
        BinaryStringArray[i] = VarToByte[3] %2 + '0';
        BinaryStringArray[i+8] = VarToByte[2] %2 +'0';
        BinaryStringArray[i+16] = VarToByte[1] %2 +'0';
        BinaryStringArray[i+24] = VarToByte[0] %2 +'0';

        VarToByte[3] /=2;
        VarToByte[2] /=2;
        VarToByte[1] /=2;
        VarToByte[0] /=2;
    }
    BinaryStringArray[32] = NULL;

    printf("%s", BinaryStringArray);
}
  1. 먼저, float을 선언해서 특정한 값(여기서는 4)를 대입했습니다.
  2. VarToByte라는 char 포인터를 이용 캐스팅 했습니다. float값을 byte 단위로 읽기위한 작업입니다.
  3. 반복문을 돌면서 각 byte를 2진수 문자열로 변환합니다.

IA-32는 little endian 이기 때문에 바이너리로 값을 보기 편하게 하기 위해 byte 순서를 거꾸로 읽습니다.

01000000100000000000000000000000
0 10000001 00000000000000000000000
부호 지수부 가수부

0 / 10000001 / 00000000000000000000000로 나눠 읽을 수 있습니다.

  • 부호는 0이므로 양수, 지수부는 excess 127코드로 의미하는 값은 2입니다.
  • 가수부는 0이지만, 첫자리 1이 생략된 값이므로 1.0000.. 에 해당합니다.
  • 1.0에 2의 2승이므로 2자리를 쉬프트 하면 100.0은 10진수 4와 동일합니다.
0 10000010 10000000000000000000000
부호 지수부 가수부

01000001010000000000000000000000 는 12를 표현한 값입니다.
0 / 10000010 / 10000000000000000000000로 나눠 읽을 수 있습니다.

  • 1.1에 2의 3승이므로 3자리를 쉬프트 하면 1100.0은 10진수 12와 동일합니다.
이 블로그는 개인 블로그입니다. 게시글은 오류를 포함하고 있을 수 있지만, 저자는 오류를 해결하기 위해 노력하고 있습니다.
게시글에 별도의 고지가 없는 경우, 크리에이티브 커먼즈 저작자표시-비영리-변경금지 4.0 라이선스를 따릅니다.

This blog is personal blog. published posts may contain some errors, but author doing efforts to clear errors.
If post have not notice of license, it under creative commons Attribution-NonCommercial-NoDerivatives 4.0.