#include<iostream>
#include<stdint.h>/*定义了精确宽度的整数类型,
例如这里用到的 uint32_t。*/
#include<limits.h>//定义整形最大值和最小值
using namespace std;
//浮点转整形函数
int float_to_int(float num)//返回值为整形
{
//首先将浮点数转换成无符号32位数
uint32_t float_bits = *(uint32_t*)#/*将num的地址转换为
无符号的指针,在解引用将num当做32位无符号整形处理*/
//然后依次将符号位,阶码,尾数提取出来
//1、提取符号位
int sign=float_bits >> 31?-1:1;//右移31位符号位到最低位
//2、提取阶码
int exponent = ((float_bits >> 23) & 0xff)-127;/*右移23位把尾数扔掉
0xff=0000 0000 1111 1111.减127为真值*/
//3、提取尾数
uint32_t mantissa = (float_bits & 0x7fffff) | 0x800000;
/*0000 0000 0111 1111 1111 1111 1111 1111.
0000 0000 1000 0000 0000 0000 0000 0000*/
//特殊情况:指数小于0时,整形直接为0
if (exponent < 0) {
return 0;
}
//为0时是正负1
else if (exponent==0)
{
return sign?-1:1;//符号位为 1时是负的,0时是正的
}
//防止溢出
else if (exponent>31)
{
return sign==1 ? INT_MAX :INT_MIN ;
}
//判断是左移还是右移
int shift = 23 - exponent;/*如果shift正的,就说明指数小,右移。
如果shift负的,说明指数大,左移*/
if (shift > 0) {
mantissa >>= shift;
}
//计算最高位为1的位置
else
{
int highest_1 = 31;//0~31共32位
//拿一个变量来放尾数,防止被改变
uint32_t temp = mantissa;
while (temp>0)
{
if (temp & 0x80000000 != 0) {
break;//找到最高位1,退出循环
}
highest_1--;//长度减1
temp <<= 1;//每次左移1次,将最高位扔掉
}
//防止溢出
if ((exponent - 23) > (32 - highest_1))/*移动的次数大于可以
移动的次数,会溢出*/
{
return sign ? INT_MAX : INT_MIN;
}
//否则就是没溢出,左移就行
mantissa <<= -shift;//注意:shift是负的,要加负号
}
//最后返回值
return sign * (int)mantissa;
}
int main()
{
float num;//定义浮点数
cout << "请输入一个浮点数:" << endl;
cin >> num;
//定义浮点转整形的函数
int result=float_to_int(num);
cout << "整形为:" << result << endl;
system("pause");
return 0;
}
浮点数强制转换成整形用代码来实现
于 2025-03-20 18:46:49 首次发布