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);
}
- 먼저, float을 선언해서 특정한 값(여기서는 4)를 대입했습니다.
- VarToByte라는 char 포인터를 이용 캐스팅 했습니다. float값을 byte 단위로 읽기위한 작업입니다.
- 반복문을 돌면서 각 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와 동일합니다.