将float型变量转换成32位二进制数,并保存在char型数组中

       受到帖子 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

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值