相关知识:
- 计算机存储大都是大端存储------高位在高地址,低位在低地址。
- 有些信息在存储时,并不需要占用一个完整的字节,而只需占几个或一个二进制位。例如在存放一个开关量时,只有0和1两种状态,用一位二进位即可。为了节省存储空间,并使处理简便,C语言又提供了一种数据结构,称为“位域”或“位段”。所谓“位域”是把一个字节中的二进位划分为几个不同的区域,并说明每个区域的位数。每个域有一个域名,允许在程序中按域名进行操作。这样就可以把几个不同的对象用一个字节的二进制位域来表示。
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下运行通过