受到帖子 http://blog.csdn.net/demon__hunter/article/details/3566232启发,
用C语言写了如下代码,将一个float型变量的内容转换为32位0、1串并输出
以float型变量(其值为4.25)为例
#include <stdio.h>
#include <string.h>
#define N 32
#define BigEnd 0
#define LittleEnd 1
void ReverseArray( char *, int len );
int JudgeBigOrLittleEnd();
int main()
{
float fVal = 4.25;
char *p = NULL;
int i = 0, j = 0;
char mask = 0x01;
char str[N+1] = "";
printf("fVal = %f\n",fVal);
if ( BigEnd == JudgeBigOrLittleEnd() )
printf("当前CPU为大端模式\n");
else
printf("当前CPU为小端模式\n");
p = (char *)&fVal; //整形变量地址转换为char *
for (i=0; i<4; i++)
{
mask = 0x01;
for (j=0; j<8; j++)
{
if (*(p+i) & (mask<<j)) //用mask与上*(p+i)第j位,通过判断是否非零决定该位是'0'还是'1'
str[8*i+j] = '1';
else
str[8*i+j] = '0';
}
}
str[N] = '\0';
ReverseArray( str, N );
printf("%s\n",str);
for ( i=0; i < 32; i ++)
{
printf("%c",str[i]);
if (0 == (i+1)%8)
printf(" ");
}
printf("\n");
}
void ReverseArray( char *s, int len )
{
int i = 0;
char tmp = 'a';
if ( NULL == s )
return;
while( i < len/2 )
{
tmp = s[i];
s[i] = s[len-i-1];
s[len-i-1] = tmp;
i++;
}
}
int JudgeBigOrLittleEnd()
{
int x = 0x12345678;
char b = (char)x;
if (0x78 == b)
return LittleEnd;
else
return BigEnd;
}
运行结果:
mahone@lte:~/ws/LinuxC/projects/float2binary$ ./a.out
fVal = 4.250000
当前CPU为小端模式
01000000100010000000000000000000
01000000 10001000 00000000 00000000
解析:
由于float型变量,值为4.25时,其在内存中存储方式为
01000000100010000000000000000000
第一位为0,表示正,接下来8位为10000001,即1*2^7 + 1 = 129,指数位偏移位数计算方式为129-127 = 2(小数点向右)
低23位为小数部分: 00010000000000000000000,添上小数点,加上小数点前面的1,即
1.0001
小数点右移两位,加上符号,最终为
100.01
也即:1*2^2 + 1*2^(-2) = 4 + 1/4 = 4.25