大家好,欢迎来到IT知识分享网。
之前写过几次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();
内存拷贝函数:可以拷贝任意数据类型,拷贝长度为指定大小。
float fla = -12.5;
unsigned long ina;
memcpy(&ina ,&fla,sizeof(float));
接下来的事情,就比较容易了:
//得到并记录符号位
int GetSign(unsigned long ina)
{
int sign = ina & (1<<31);
if(sign != 0)
{
return -1;
}
else
{
return 1;
}
}
//读出指数位
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;//将指数位右移最左边
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.
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/10101.html