int用C中的按位运算符浮动

时间:2015-01-03 20:18:04

标签: c

我正在编写一个函数,用于将int转换为具有位运算符的float。我不明白为什么我的代码对所有输入都不起作用。例如,它适用于2,19,43等,但它输出-nan为7,6,13,58,依此类推。有人可以解释一下,为什么会这样?谢谢。这是我的代码:

#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编译器。

1 个答案:

答案 0 :(得分:2)

问题是&#34; m&#34;,int已签名,右移将签署延期。

ime.x |= m>>9;

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

我已修复它并做了一些小改动:demo