Casting float en int (bit à bit) en C

Compte tenu de la 32 bits qui représentent une norme IEEE 754 nombre à virgule flottante, comment le nombre être converti en entier, à l'aide d'entiers ou les opérations sur les bits de la représentation (plutôt que d'utiliser une instruction machine ou le compilateur opération à convertir)?

J'ai la fonction suivante, mais il échoue dans certains cas:

D'entrée: int x (contient 32 bits de précision unique numéro de la norme IEEE 754 format)

  if(x == 0) return x;

  unsigned int signBit = 0;
  unsigned int absX = (unsigned int)x;
  if (x < 0)
  {
      signBit = 0x80000000u;
      absX = (unsigned int)-x;
  }

  unsigned int exponent = 158;
  while ((absX & 0x80000000) == 0)
  {
      exponent--;
      absX <<= 1;
  }

  unsigned int mantissa = absX >> 8;

  unsigned int result = signBit | (exponent << 23) | (mantissa & 0x7fffff);
  printf("\nfor x: %x, result: %x",x,result);
  return result;
Ce ne jette pas un float en int. Il vient de copie bit à bit de leur représentation de l'ordinateur, sans exemple: conversion d' 2.03e1 à 20 [arrondissement] comme le (int)2.03e1 plâtre.
Vous voulez ne faire au niveau du bit? Eh bien, c'est comment vous le faites au niveau du bit qu'il réinterprète les octets. Pas les étapes, vraiment.
Mais 0x7eff8965 = 1325268755 (après la coulée). Si vous utilisez l'HEX dans la norme IEEE 754 Calc, vous obtenez 1.6983327 e+38 et HEXADÉCIMAL vers décimal donne: 2130676069 - aucun d'entre eux donne le résultat correct de 1325268755.
Ce code a un comportement indéfini dans C. Voir la section 6.5 de la norme.
Est de votre question: compte tenu de la 32 bits qui représentent un float x, comment la conversion (int) x être mis en œuvre, à l'aide de entier/les opérations sur les bits de la représentation (plutôt que d'utiliser une instruction machine à convertir virgule flottante entier)?

OriginalL'auteur Anonymous | 2012-09-09