将int和int的float转换为float

时间:2017-04-25 18:25:37

标签: c pointers casting floating-point

指针有点困难。我必须将一个浮点数存储在一个无符号整数数组中,并且能够将它拉出来。

我知道有一种特殊的方法来强制转换,所以我不会对这些位进行重新排序,我认为当我想将它存入数组时,这是存储它的正确方法:

float f = 5.0;
int newF = (int *) f;
arrayOfInts[0] = *newF

这似乎成功地将值存储在数组中。 但是,在某些时候我必须从整数数组中取出值,这就是我的混乱所在(假设我正确地输入了数组)

float * f = (float *) arrayOfInts[0]
int result = *f;

然而,这给了我警告:'从不同大小的整数'转换为指针

如果不进行某种长时间演员,我真的无法想到如何解决这个问题......这似乎不对..

我不想丢失值或损坏位..显然它将失去小数点精度..但我知道他们的某些方法来安全地来回转换

2 个答案:

答案 0 :(得分:3)

  

我必须将一个浮点数存储在一个无符号整数数组中,并且能够将它拉出来。

使用unionunsigned char[]。指定unsigned char没有任何填充,并且所有位组合都有效。许多其他数字类型并非总是如此。通过将floatunsigned char[]重叠,代码可以检查每个"字节" float,一次一个。

union {
  float f;
  unsigned char uc[sizeof (float)];
} x;

// example usage
x.f = 1.234f;
for (unsigned i = 0; i<sizeof x.uc; i++) {
  printf("%u:%u\n", i, 1u*x.uc[i]);
}

示例输出:您的可能会有所不同

0:182
1:243
2:157
3:63

float - &gt; unsigned char[] - &gt; float始终是安全的。

unsigned char[] - &gt; float - &gt; unsigned char[]并非总是安全,因为unsigned char[] 的组合可能没有有效的float值。

避免使用指针技巧和强制转换。有对齐和尺寸问题。

// Poor code
float f = 5.0f;
int newF = *((int *) &f);  // Conversion of `float*` to `int*` is not well specified.

代码也可以覆盖固定宽度的无填充类型,如(u)int32_t,如果它们存在(通常是这样)并且大小匹配。

#include <stdint.h>
union {
  float f;
  uint32_t u32;
} x32;


#include <assert.h>
#include <inttypes.h>

// example usage
assert(sizeof x32.f == sizeof x32.u32);
x32.f = 1.234f;
printf("%" PRNu32 "\n", x32.u32);
}

示例输出:您的输出可能会有所不同

1067316150

答案 1 :(得分:1)

将float转换为int

float fval = 123.4f;
int ival = *(int*)&fval;

转换回来

int ival = /* from float */
float fval = *(float*) &ival;
如果float和int的大小不同,它就不会起作用,但可能你已经知道了。在chux的其他答案中概述的unsigned char union方法更加健壮,但对于您可能想要做的事情而言过于复杂。