关于float转int的函数实现

之前写过几次int与char类型的字符串相互转换的问题,这次就想以float转成int为题,进行函数实现。

首先先对float的存储方式,做一个简单说明:


float(浮点数):在32位的计算机中占4个字节,存储格式为1位的符号位、8位的指数位、23位的尾数位。


1位的二进制数,若为1则表示为负数,若为0则表示为正数。

 

8位的二进制数,表示范围为0 ~255,IEEE规定指数位减去127为真正的指数,指数范围为-126~128。


23位的二进制数,最高位(整数位)的1省略不保存。若需要取整数部分,则需要将尾数位左移到整数位,再将最高位的1补齐,左移位数由指数决定。

因为float类型不能使用"<<",">>"运算符,得到二进制位。笔者在进行上述尝试时,均以编译器自动调整数据而失败。在浏览了多篇文档后,找到一个适合本次要求的函数,内存拷贝函数 memcpy();

内存拷贝函数:可以拷贝任意数据类型,拷贝长度为指定大小。

  1. float fla = -12.5;  
  2. unsigned long ina;  
  3. memcpy(&ina ,&fla,sizeof(float));  
float fla = -12.5;
unsigned long ina;
memcpy(&ina ,&fla,sizeof(float));
接下来的事情,就比较容易了:
  1. //得到并记录符号位  
  2. int GetSign(unsigned long ina)  
  3. {  
  4.     int sign = ina & (1<<31);  
  5.     if(sign != 0)  
  6.     {  
  7.         return -1;  
  8.     }  
  9.     else  
  10.     {  
  11.         return 1;  
  12.     }  
  13. }  
//得到并记录符号位
int GetSign(unsigned long ina)
{
	int sign = ina & (1<<31);
	if(sign != 0)
	{
		return -1;
	}
	else
	{
		return 1;
	}
}

  1. //读出指数位  
  2. int GetExp(unsigned long ina)  
  3. {  
  4.     int exp = 0;  
  5.     for(int i=23; i<31; i++)  
  6.     {  
  7.         exp |= (ina & 1<<i);  
  8.     }  
  9.     exp >>= 23;  
  10.     exp -= 127;//ieee 规定指数位须减去127 为真正的指数  
  11.       
  12.     return exp;  
  13. }  
//读出指数位
int GetExp(unsigned long ina)
{
	int exp = 0;
	for(int i=23; i<31; i++)
	{
		exp |= (ina & 1<<i);
	}
	exp >>= 23;
	exp -= 127;//ieee 规定指数位须减去127 为真正的指数
	
	return exp;
}

注释1:

exp >>= 23;//将指数位右移最左边


  1. ina &= (1<<23)-1;//保留小数位  
  2. ina |= 1<<23;//填入小数位前的 1  
  3. ina >>= (23-exp);//整数部分右移到合适位置  
  4. ina *= sign;//符号位  
ina &= (1<<23)-1;//保留小数位
ina |= 1<<23;//填入小数位前的 1
ina >>= (23-exp);//整数部分右移到合适位置
ina *= sign;//符号位

注释2:

ina &= (1<<23)-1;//将尾数位的数字保留下,其余数字丢弃;

 
至此,就得到了正确的float类型转为int类型的数据。

参考文献:1.float数据在内存中的存储方法 http://blog.csdn.net/yezhubenyue/article/details/7436624;

2.C函数之memcpy()函数用法 http://blog.csdn.net/tigerjibo/article/details/6841531.

本文转自:http://blog.csdn.net/teemo_king/article/details/77822079

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值