Estimado:
Disculpame que me olvidé de responder. La solución tiene algunos problemas. En la siguiente línea:
parte_entera = (1 << exp) | (frac << (23 - exp));
el resultado se empieza a complicar cuando exp >= 23. Personalmente no sé qué resultado da la operación << cuando la cantidad de bits a shiftear es negativa, pero asumiendo que el resultado sea 0 siempre (por decir algo), de igual manera hay problema con la primer parte de la operación, ya que el 1 << exp va a dar 0 cuando exp >= 32, porque el resultado es mayor a lo que puede guardar un int (el resultado se trunca). Por lo tanto no vas a poder reconocer el overflow con la comparación con el máximo y el mínimo.
Hay otro tema con la comparación de máximos y mínimos. En tu código no definiste los tipos de max o min, pero asumiendo que sean ints de 32 bits como el resto de las variables, entonces min y max son dos valores positivos muy cercanos. No me queda claro bien cuál es tu idea con la comparación:
if (parte_entera > max || parte_entera < min)
Pero por lo que está escrito ahí arriba, esa comparación va a ser casi siempre verdadera. Capaz te falta un signo de menos en el mínimo, pero para hacer una comparación con signo tendrías que también ponerle signo a la parte_entera según el signo del número en punto flotante... hay que trabajarlo un poco más.
Por último, al final:
if (signo == 1) {
parte_entera = - parte_entera + 1;
}
Entiendo que estás tratando de cambiar el signo a la parte entera en complemento a 2, pero hay un error conceptual, y es que el operador (-) ya realiza la negación en complemento a dos! Por lo tanto no es necesario sumar uno. Podrías realizar la conversión manualmente utilizando el operador (~) para realizar la negación bit a bit, pero no es necesario porque basta con el operador (-)
Saludos,
Federico