在C语言中使用位运算符将整型转换为浮点型

3

我正在编写一个使用位运算将整数转换为浮点数的函数。 我不明白为什么我的代码不能适用于所有输入。例如,它适用于2、19、43等数字,但对于7、6、13、58等数字,则输出-nan。能否有人解释一下这是为什么?谢谢。以下是我的代码:

#include <stdio.h>

typedef union{
    int x;
    float fx;
}df;
int find_e(int x,int i){
    if(x&1<<i) return i;
    if(x==0) return -127;
    return find_e(x,--i);
}
float int_to_float(int x){
    df ime;
    ime.x=0;
    int sign = 0;
    if(x<0){x=-x;sign = 1<<31; }
    int position = find_e(x,31);
    int e = position + 127;
    int m = (x&(~(~0<<position)))<<(32-position);
    ime.x |= sign;
    ime.x |= e<<23;
    ime.x |= m>>9;
    return ime.fx;
}

int main()
{
    int x;
    scanf("%d",&x);
    printf("%f\n", int_to_float(x));
    return 0;
}

我使用gcc编译器。

3
根据C标准,您已经超过了int类型允许的最大值。您的编译器正在报告该问题...请在问题标签中加上编译器的名称。为了使内容更加通俗易懂,可以将其翻译为:您的代码超出了C标准规定的int类型的最大值限制。因此,编译器会显示出错信息,请在问题标签中注明使用的编译器名称。 - Am_I_Helpful
请阅读 这个网址 - philipxy
我必须问一下:为什么? - GrahamS
注意:可能会在 INT_MIN 失败。对于大的 int,也不能正确地四舍五入。但作为一项练习已经足够了。 - chux - Reinstate Monica
1个回答

2
问题在于变量“m”的类型是有符号整数int,而右移将进行符号扩展。
ime.x |= m>>9;

将所有不能为负数的变量改为 unsigned 而不是 int

我已经修复了它并进行了一些小的更改:演示


谢谢!真是个愚蠢的错误。 :) - szmasters

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接