#include <stdio.h>
typedef unsigned float_bits;
#define TMin 0x80000000
int float_f2i(float_bits f)
{
unsigned sign, exp, frac, last_bit;
int i;
sign = f >> 31;
exp = (f >> 23) & 0xff;
frac = f & 0x7fffff;
if (exp == 158 && frac == 0 && sign == 1) //处理f = TMin的情况
i = TMin;
else if (exp > 157 || exp == 0xff) //处理f上溢出或f是NaN的情况
i = TMin;
else if (exp < 126) //处理f下溢出
i = 0;
else
{
exp -= 127;
frac |= 0x800000;
if (exp > 23)
{
exp -= 23;
frac <<= exp;
}
else if (exp < 23)
{
exp = 23 - exp;
frac >>= exp;
}
if (sign == 1)
i = (~frac) + 1;
else
i = frac;
}
return i;
}
int main(void)
{
unsigned i;
int j, k;
float f;
for (i = 0x3fbfff70U; i <= 0xffffffffU; i++)
{
f = *(float *)&i;
j = (int)f;
k = float_f2i(i);
printf("%f : %d %d\n", f, j, k);
}
return 0;
}
我将它在虚拟机上实现,运行时出现以下问题——它无法停止运行。
代码行中for循环i的意义我没弄明白。于是我尝试将循环删除,留下中间计算的值,此时选值i应该是个随机值。
尴尬的是我试图将f变成一个键入的值时,我发现i应该是按位循环来实现判断功能的,所以我依然没有明白这段函数的输入口在哪里。。。不过大致读懂了这段代码。
2018-2019-1 20165322《信息安全系统设计基础》第2周学习总结
原文:https://www.cnblogs.com/wangyaojia/p/9733673.html