指针有点困难。我必须将一个浮点数存储在一个无符号整数数组中,并且能够将它拉出来。
我知道有一种特殊的方法来强制转换,所以我不会对这些位进行重新排序,我认为当我想将它存入数组时,这是存储它的正确方法:
float f = 5.0;
int newF = (int *) f;
arrayOfInts[0] = *newF
这似乎成功地将值存储在数组中。 但是,在某些时候我必须从整数数组中取出值,这就是我的混乱所在(假设我正确地输入了数组)
float * f = (float *) arrayOfInts[0]
int result = *f;
然而,这给了我警告:'从不同大小的整数'转换为指针
如果不进行某种长时间演员,我真的无法想到如何解决这个问题......这似乎不对..
我不想丢失值或损坏位..显然它将失去小数点精度..但我知道他们的某些方法来安全地来回转换
答案 0 :(得分:3)
我必须将一个浮点数存储在一个无符号整数数组中,并且能够将它拉出来。
使用union
和unsigned char[]
。指定unsigned char
没有任何填充,并且所有位组合都有效。许多其他数字类型并非总是如此。通过将float
与unsigned 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方法更加健壮,但对于您可能想要做的事情而言过于复杂。