在指针方面有一点困难。我必须将一个浮点数存储在一个无符号整数数组中,然后才能将其取出。
我知道有一种特殊的方法来转换它,所以我不会对位重新排序,当我想把它放到数组中时,我认为这是正确的存储方法:
float f = 5.0;
int newF = (int *) f;
arrayOfInts[0] = *newF它似乎成功地将值存储在数组中。然而,在某些情况下,我必须将值从into数组中拉回,这就是我的困惑所在(假设我正确地输入了数组)。
float * f = (float *) arrayOfInts[0]
int result = *f;然而,这给了我一个警告:“从不同大小的整数转换成指针”
我真的想不出怎么解决这个问题,而不是一些长篇大论..这似乎不太对..。
我不想失去它的价值,也不想损坏它。显然,它将失去小数点精度。但我知道他们有办法让安全来回转换
发布于 2017-04-26 03:02:23
我必须把一个浮点数存储在一个无符号整数数组中,然后才能把它取出来。
使用union和unsigned char[]。unsigned char被指定为没有任何填充,并且所有位组合都有效。这并不总是适用于许多其他数字类型。通过用unsigned char[]覆盖float,代码可以一次检查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:63float --> unsigned char[] --> float总是安全的。
unsigned char[] --> float --> 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发布于 2017-06-06 23:19:27
将浮点型转换为整型
float fval = 123.4f;
int ival = *(int*)&fval;转换回
int ival = /* from float */
float fval = *(float*) &ival;如果float和int的大小不同,它就不会起作用,但想必你已经知道了。other answer for chux中概述的无符号字符并集方法更健壮,但对于您可能想要做的事情来说过于复杂。
https://stackoverflow.com/questions/43618299
复制相似问题