所以我需要写一个方法来实现这个难题:
float_f2i
返回浮点参数f的表达式(int)f的位级等价物。
参数作为unsigned int传递,但它被解释为位级 表示单精度浮点值。
超出范围(包括NaN和无穷大)的任何内容都应返回0x80000000u。
所以我从中得到的是我给了一个十六进制的数字,我必须编写代码以整数格式。给我们的测试案例是;
Argument [0x00800000], returns [0x0]
因为0x00800000是1.1754 ...... E-38,小到可以归零(所以我假设)
到目前为止我所拥有的是:
int float_f2i(unsigned uf) {
unsigned sign = uf & (0x80000000);
unsigned exp = uf >> 23 & 0xff;
unsigned frac = uf & 0x7fffff;
//takes care of NaN and inifinity
if (exp == 255) {return 0x80000000u;}
if ((exp > 0) && (exp < 255)) //normalized
{
if ((sign >> 28) == 0x0) //if sign bit is 0
{
return (0x1); //NEEDS MORE HERE
}
else if ((sign >> 28) == 0x8) //if sign bit is 1
{
return (0x8); //NEEDS MORE HERE
}
}
else if (exp == 0)//denormalized
{
return 0; // rounds to zero anyway
}
}
我知道为了这个工作我必须在指数部分添加返回语句(1.frac ^(exp-127))但我不知道如何编码。转移到左边乘以两个但是对于2的负指数,我需要向右移动但是&gt;&gt;算术运算符。我是否需要创建一个动态掩码来消除由算术移位产生的1位?
编辑:得到答案,我走错了方向,如果有人必须这样做,将来会参考:
int float_f2i(unsigned uf) {
int exponent = (uf >> 23) & 0ff;
int exp = exponent - 127;
int frac = uf & 0x7fffff;
if(exponent == 0x7F800000)
return 0x80000000u;
if(!exponent)
return 0;
if(exp < 0)
return 0;
if(exp > 30)
return 0x80000000u;
frac = frac | 0x800000;
if (exp >= 23)
frac = frac << (exp - 23);
else
frac = frac >> (23 - exp);
if((uf >> 31) & 1)
return ~frac + 1;
return frac;
}
答案 0 :(得分:0)
c
只有一个右移运算符>>
,但当数字是有符号值类型时,这只是算术移位。
main()
{
int x = -2;
printf("%d\n",x>>1);
printf("%d\n",((unsigned int)x)>>1);
return 0;
}
因此,如果需要确保非算术移位,则可以转换为无符号。