C语言 将int值编码为IEEE-754浮点数(二进制32)

rjee0c15  于 2022-12-22  发布在  其他
关注(0)|答案(7)|浏览(260)

给定表示IEEE 754浮点数的32位,如何使用整数或位操作将该数转换为整数(而不是使用机器指令或编译器操作进行转换)?
我有以下函数,但在某些情况下会失败:
输入:int x(包含IEEE 754格式的32位单精度数字)

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;
vx6bjr1n

vx6bjr1n1#

C有“联合”来处理这种类型的数据视图:

typedef union {
  int i;
  float f;
 } u;
 u u1;
 u1.f = 45.6789;
 /* now u1.i refers to the int version of the float */
 printf("%d",u1.i);
z9smfwbn

z9smfwbn2#

&x给出x的地址,因此具有float*类型。
(int*)&x将该指针转换为指向int的指针,即转换为指向int*的事物。
*(int*)&x解引用该指针为int值。在intfloat具有不同大小的计算机上,它不会执行您所认为的操作。
而且可能存在字节顺序问题。
该解用于快速平方根倒数算法。

7gyucuyw

7gyucuyw3#

// With the proviso that your compiler implementation uses
// the same number of bytes for an int as for a float:
// example float
float f = 1.234f;
// get address of float, cast as pointer to int, reference
int i = *((int *)&f);
// get address of int, cast as pointer to float, reference
float g = *((float *)&i);
printf("%f %f %08x\n",f,g,i);
yqhsw0fo

yqhsw0fo4#

float x = 43.133;
int y;

assert (sizeof x == sizeof y);
memcpy (&y, &x, sizeof x);
...
jljoyd4f

jljoyd4f5#

你可以使用一个引用来强制转换浮点数。这样的强制转换应该不会生成任何代码。
C++

float f = 1.0f;
int i = (int &)f;
printf("Float %f is 0x%08x\n", f, i);

输出:

Float 1.000000 is 0x3f800000

如果你想要c++风格的类型转换,使用reinterpret_cast,就像这样。

int i = reinterpret_cast<int &>(f);

它不适用于表达式,必须将其存储在变量中。

int i_times_two;
    float f_times_two = f * 2.0f;
    i_times_two = (int &)f_times_two;

    i_times_two = (int &)(f * 2.0f);
main.cpp:25:13: error: C-style cast from rvalue to reference type 'int &'
juzqafwq

juzqafwq6#

你不能用这种方式(有意义地)将浮点数转换成“整数”(signed intint)。
它可能最终具有整数类型,但实际上它只是IEEE754编码空间的索引,本身不是有意义的值。
您可能会认为unsigned int具有位模式和整数值的双重用途,但int没有。
还有platform issues,它对有符号整数进行位操作。

cyej8jka

cyej8jka7#

将浮点数乘以一个你想要的因子。在这个例子中我乘以100,000,因为分数后面的5位小数在我的运算中有意义。
将其转换为字节,然后将它们相加,再除以100,000。

double angleX, angleY;
angleX = 3.2342;
angleY = 1.34256;
printf("%f, %f", (double)angleX, (double)angleY);

int remain, j;
int TxData[8];
j=0;
remain=0;
unsigned long data = angleX*100000;
printf("\ndata : %d\n", data);

while(data>=256)
{
    remain= data%256;
    data = data/256;
    TxData[j]= remain;
    printf("\ntxData %d : %d", j, TxData[j]);
    j++;
}
TxData[j] = data;
printf("\ntxData %d : %d", j, TxData[j]);

int i=0;
long int angleSon=0;
for(i=0;i<=j;i++)
{

    angleSon += pow(256,i)*TxData[i]; 
    printf("\nangleSon : %li", angleSon);
}

相关问题