float强制转换成int

        相关知识:
  • 计算机存储大都大端存储------高位在高地址,低位在低地址。
  • 有些信息在存储时,并不需要占用一个完整的字节,而只需占几个或一个二进制位。例如在存放一个开关量时,只有0和1两种状态,用一位二进位即可。为了节省存储空间,并使处理简便,C语言又提供了一种数据结构,称为“位域”或“位段”。所谓“位域”是把一个字节中的二进位划分为几个不同的区域,并说明每个区域的位数。每个域有一个域名,允许在程序中按域名进行操作。这样就可以把几个不同的对象用一个字节的二进制位域来表示。
        读取float变量的 结构体设计
struct FloatNode
{	
	unsigned int mantissa : 23;	//尾数部分,隐藏了个位和小数点的有效数字
	unsigned int exponent : 8;	//阶码,也称指数位,用于存储科学计数法中的指数数据,并且采用移码存储
	unsigned int sign : 1;	        //符号位,0代表正,1代表负
};
        例如,-8.25在内存中的存储情况:
        完整代码如下:
#include<stdio.h>
struct FloatNode
{	
	unsigned int mantissa : 23;	//尾数部分,隐藏了个位和小数点的有效数字
	unsigned int exponent : 8;	//阶码,也称指数位,用于存储科学计数法中的指数数据,并且采用移码存储
	unsigned int sign : 1;	        //符号位,0代表正,1代表负
};

int 
Float_To_Int(float ft)
{
	FloatNode* fN = (FloatNode *)&ft;
	if (fN->exponent >= 127)
	{
		int sign = 1;	//初始假定该浮点数为正
		int mov = 23 - (fN->exponent - 127);
		int ret = (fN->mantissa | (1 << 23)) >> mov;
		if (fN->sign == 1)	//如果符号位为1
			sign = -1;
		ret *= sign;
		return ret;
	}
	else
		return 0;
}

int main()
{
	float a = -12390000.128;
	int ret = Float_To_Int(a);
	printf("%d", ret);
	return 0;
}


本程序在VS2017下运行通过

猜你喜欢

转载自blog.csdn.net/qq_41822235/article/details/80789361
今日推荐