【问题标题】:how to convert int type to ieee754?如何将int类型转换为ieee754?
【发布时间】:2019-05-06 03:04:19
【问题描述】:

我在采用整数类型后尝试打印出 IEEE754,但它没有为我显示正确的答案。 我想在 main 方法中将整数传递给函数“void ieee(int x)”,然后它将打印出 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;       
 }

【问题讨论】:

  • 那么预期的输出是什么?
  • @ybungalobill 如果我们输入 3,它将是 010000000100000000000000000000000

标签: c ieee-754


【解决方案1】:

您正在 intstruct 类型之间进行类型双关语,其中包含 float 的内部表示。

这会给你错误的答案。

如果您想知道整数的浮点表示,可以通过对float 进行先前的强制转换来获得正确的结果。

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

此外,请注意不能假设 IEEE 浮点表示正用于 float
例如,请参阅此链接:

Macro __STDC_IEC_559__

另一方面,位域不一定在所有实现中都是连续的。

Bitfield disadvantages

【讨论】:

  • 您还必须知道尾数使用了多少位以及使用的总存储空间,
  • 通过假设 IEEE 754 单精度,显然 OP 所做的,尾数和指数的位数是正确的。
  • 从 IEEE 754-2008 开始,它被称为 binary32
  • 不需要演员表。 var.f = x; 就够了。
  • 位域在适合实现使用的存储单元时必然是连续的:C 2018 6.7.2.1 11:“如果剩余空间足够,则位域紧跟另一个位域在一个结构中,应被打包到同一单元的相邻位中。”实际问题是分配顺序(先使用高位还是低位)和使用的存储单元的宽度。
【解决方案2】:

以下使用联合将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);
}

【讨论】:

    猜你喜欢
    • 2016-03-12
    • 2018-02-11
    • 1970-01-01
    • 1970-01-01
    • 2020-10-22
    • 1970-01-01
    • 1970-01-01
    • 2014-02-20
    • 1970-01-01
    相关资源
    最近更新 更多