Jak przekonwertować niepodpisane int na float?

Muszę zbudować funkcję, która zwraca ekwiwalent bitowy (float) x bez użycia żadnych pływających typów danych, operacji lub stałych. Myślę, że ją mam, ale kiedy uruchamiam plik testowy, zwraca on, że istnieje nieskończona pętla. Każda pomoc w debugowaniu byłaby doceniana.

Mogę używać dowolnych operacji całkowitych / niepodpisanych, w tym ||, &&, if, while. Poza tym mogę korzystać tylko z 30 operacji

unsigned float_i2f(int x) {
    printf("\n%i", x);
    if (!x) {return x;}
    int mask1 = (x >> 31);
    int mask2 = (1 << 31);
    int sign = x & mask2;
    int complement = ~x + 1;
    //int abs = (~mask1 & x) + (mask1 & complement);
    int abs = x;
    int i = 0, temp = 0;
    while (!(temp & mask2)){
        temp = (abs <<i);
        i = i + 1;
    }
    int E = 32 - i;
    int exp = 127 + E;
    abs = abs & (-1 ^ (1 << E));
    int frac;
    if ((23 - E)>0)
        frac = (abs << (23 - E));
    else
        frac = (abs >> (E - 23));
    int rep = sign + (exp << 23) + frac;
    return rep;
}

W odpowiedzi na bardzo pomocne komentarze i odpowiedzi, oto zaktualizowany kod, który teraz kończy się niepowodzeniem dla 0x80000000:

unsigned float_i2f(int x) {
    int sign;
    int absX;
    int E = -1;
    int shift;
    int exp;
    int frac;
    // zero is the same in int and float:
    if (!x) {return x;}

    // sign is bit 31: that bit should just be transferred to the float:
    sign = x & 0x80000000;

    // if number is < 0, take two's complement:
    if (sign != 0) {
        absX = ~x + 1;
    }
    else
        absX = x;

    shift = absX;
    while ((!!shift) && (shift != -1)) {
        //std::cout << std::bitset<32>(shift) << "\n";
        E++;
        shift = (shift >> 1);
    }
    if (E == 30) { E++;}
    exp = E + 127+24;
    exp = (exp << 23);
    frac = (absX << (23 - E)) & 0x007FFFFF;
    return sign + exp + frac;
}

Ktoś ma jakiś pomysł, gdzie jest błąd w poprawionym kodzie? Jeszcze raz dziękuję!

questionAnswers(3)

yourAnswerToTheQuestion