как конвертировать тип int в ieee754? - PullRequest
0 голосов
/ 06 мая 2019

Я пытаюсь распечатать IEEE754 после получения целочисленного типа, но он не показывает правильный ответ для меня. Я хочу передать целое число в функцию "void ieee (int x)" в методе main, затем она выведет формат IEEE754.

#include <stdio.h>
#include <math.h>
#include <stdlib.h>

int binary(int n, int i) 
{
    int k;
    for (i--; i >= 0; i--)
   {
      k = n >> i;
      if (k & 1)
      printf("1");
      else
      printf("0");
    }
}

typedef union
{
  int f;
  struct
  {
        unsigned int mantissa : 23;
        unsigned int exponent : 8;
        unsigned int sign : 1;
   } field;
} myfloat;

void ieee(int x)
{

int i;

myfloat var = (myfloat)x;



printf("%d ",var.field.sign);

binary(var.field.exponent, 8);
printf(" ");

binary(var.field.mantissa, 23);
printf("\n");
}

int main()
{
int x = 3;
ieee(x);

return 0;       
 }

Ответы [ 2 ]

1 голос
/ 06 мая 2019

Вы делаете штамп типа между типами int и struct, содержащими внутреннее представление float.

Это даст вам неправильные ответы.

Если вы хотите знать представление целого числа с плавающей запятой, правильный результат можно получить, выполнив предыдущее приведение к float.

int x = 3;
myfloat var;
var.f = (float)x; 
binary(var.field.exponent, 8);
binary(var.field.mantissa, 23);

Кроме того, примите во внимание, что нельзя предположить, что представление IEEE с плавающей запятой используется для float.
Например, посмотрите эту ссылку:

Макрос __STDC_IEC_559__

С другой стороны, битовые поля не обязательно являются смежными во всех реализациях.

См. Недостатки битового поля .

0 голосов
/ 06 мая 2019

Следующее использует объединение, чтобы переосмыслить представление float как 32-разрядное целое число без знака. Это допустимо в C. В C ++ объединение не может использоваться для этого, и необходимо скопировать байты из float в целое число, как с memcpy.

#include <limits.h> //  For CHAR_BIT (overkill but demonstrates some portability).
#include <stdint.h>
#include <stdio.h>


static void DisplayFloat(float x)
{
    //  Use a union to reinterpret a float as a 32-bit unsigned integer.
    union { float f; uint32_t u; } t = { x };

    //  Ensure float and uint32_t are the same width.
    _Static_assert(sizeof t.f == sizeof t.u,
        "float and uint32_t must be same width.");

    //  Display the bits of the unsigned integer.
    for (int i = sizeof t.u * CHAR_BIT - 1; 0 <= i; --i)
        putchar('0' + (t.u >> i & 1));
    putchar('\n');
}


int main(void)
{
    DisplayFloat(3);
}
...