将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
    评论
支持下载,一、据类 常量是有据类变量必须声明其据类 (1)划分: 1.基本据类(四类八种) : 整:bute、short、int、long 浮点float、double 字符char 布尔:boolean 2.引用据类:除基本据类外的所有都是基本据类 : 类 所占空间 取值范围 默认值 字节 byte 1个字节(8位) -128—127 0 短整 short 2个字节(16位) -32768—32767 0 整形 int 4个字节(32位) +-2(的31次方)约21亿 0 长整形 long 8个字节(64位) -2(的63次方)—2(的63次方)-1 0 浮点: 单精度浮点 float 4个字节(32位) 1.4013E-45—3.4028E+38 0.0F 双精度浮点 double 8个字节(64位) 4.9E-324—1.7977E+308 0.0D 字符: 字符 char 2个字节(16位) 0—2(的16次方)-1 \u0000 布尔: 布尔 boolean 1个字节(8位) ture,false false (2)整形常量常用的三种表现形式: 1.二进制 2.八进制:八进制的以0开头 3.十六进制:十六进制的以0x开头,0ffff:一个f代表4位 二、类换 1.自动换 2.强制换 在一个表达式中,先把所有转换成为级别最高的那个类之后,再进行运算 byte,short,char 只要在表范围中,不用强可以直接进行赋值。但是要是超出范围,就必须要进行强了 类的优先级别:byte,short,char,int,long,float,double (低–高) 右>左–强制类换 右<左–自动换 右=左–不用 三、运算符: 算术运算符: +,-,*,/,%,++,– 赋值运算符:= 关系运算符: >,<,>=,<=,==,!= instanceof 逻辑运算符: &&,||,!,^ 位运算符: &,|,^,~ , >>,<<,>>> 条件运算符:?:(三目运算符) 扩展赋值运算符:+=,-=,*=,/= 1.算运算符(+,-,*,/,%,++,–) (1) 两个int类据运算,结果是int类 两个操作中只要有一个是double类,那么结果是double类据 (2) “+”号的作用 1.表示正 2.相加运算 3.字符串拼接 在单独运算的时候 ++i,i++ 没有任何区别,都是加1操作相当于 i=i+1 i++;先运算,后加1(先运算后加减) ++i;先加1,后运算(先加减后运算) 2.逻辑运算符(&&,||,!,^) 逻辑非 ! 取反 逻辑异或 ^ 操作一样,结果为false;操作不一样,结果为true 逻辑与 & 只要有一个操作是false,那么结果就是false 短路与 && 短路与跟逻辑与 结果会一模一样。只要第一个操作是false,那么结果一定是false,那么后面的那个操作就不用计算了。提高了 效率。 逻辑或 | 只要有一个是true,那么结果就是true 短路或 || 短路或与逻辑或 结果一模一样。只要第一个操作是true,那么第二个就不用计算,结果就是true。同样为了提高效率。 3.关系运算符(>,<,>=,<=,==,!=) ==:比较变量时是判断值是否相等;比较引用变量时是判断两个在堆中的存储的地址是否相等 equals:操作时是判断两个变量是否是对同一对象的引用,即对堆中的内容进行比较 在比较引用变量时: ==判断的对象的地址 equals判断的是对象的内容 4.位运算符( &,|,^,~ , >>,<<,>>>) 在操作十进制的时候首先换为二进制进行操作 &:二进制都为1时为1,一个为0则为0 |:二进制都为0时为0,一个为1则为1 ^:二进制都为1时为0,一个为0则为1 ~:一个正取~时,取反、减一、取反、加符号 一个负取~时,直接取反

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值