IEEE浮动十六进制424ce027浮动?

时间:2011-03-02 08:22:26

标签: c++ c hex ieee-754

如果我有一个IEEE float hex 424ce027,我该如何将其转换为十进制?

unsigned char ptr[] = {0x42,0x4c,0xe0,0x27};

怎么办?

float tmp = 51.218899;

6 个答案:

答案 0 :(得分:5)

如果您不想假设使用endian并破坏各种别名规则,那么这种方法很有效:

union IntFloat {
  uint32_t i;
  float f;
};
...
union IntFloat val;
val.i = 0x424ce027;
printf("%f\n", val.f);

仍然假设'浮动'是32位,并且你的机器符合IEEE-754标准,并且匹配的字符串与整数相匹配,但我们可能会在那里停止迂腐。

答案 1 :(得分:2)

为了转换一个整数值,我和John Ripley的答案非常相似,但机制略有不同。同样的警告适用 - float和int必须是相同的大小和字节顺序,如果要将初始十六进制值视为IEEE,则​​float必须是IEEE:

float tmp;
unsigned int src = 0x424ce027;
std::memcpy(&tmp, &src, sizeof tmp);

你问如何转换为float,然后如何转换为decimal。 浮点数不是十进制。要将float转换为十进制字符串,您需要printf("%g", tmp);

之类的内容

如果从unsigned char数组开始而不是int,那么从数组中进行的任何直接复制都需要使用与平台上相同的字节顺序填充数组。你的阵列是大端的,但英特尔是小端的。因此,如果您知道平台的字节顺序与数组的字节顺序相反,那么您可以像JohnB的答案一样reverse数组。如果您知道该数组是big-endian,并且您不知道您的平台是什么字节序,那么您可以这样做(假设char数组中每个字符有8位):

unsigned int src = 0;
for (int i = 0; i < sizeof src; ++i) {
    src = (src << 8) + ptr[i];
}

然后像以前一样继续。

答案 2 :(得分:1)

...也许

float f = *reinterpret_cast<float*>(ptr);

虽然在我的x86机器上,我还必须反转字符的字节顺序以获得你想要的值。

std::reverse(ptr, ptr + 4);
float f = *reinterpret_cast<float*>(ptr);

您可能希望使用sizeof(float)而不是4或其他方式来获取大小。您可能想要反转字节的副本,而不是原始副本。你这样做有点难看。

编辑:正如评论中指出的那样,这段代码是不安全的,因为它创建了两个指针,这些指针使相同的内存别名但属于不同的类型。它可能适用于特定的编译器和程序,但不受标准的保护。

答案 3 :(得分:0)

警告:这不能保证在ANSI C中有效(浮点数不必是IEEE754)。话虽如此,

#include <stdint.h>

uint32_t x = 0x424ce027UL;
printf("%f\n", *((float *)&x));

给出了输出:

  

51.218899

答案 4 :(得分:0)

unsigned char ptr [] = {0x42,0x4c,0xe0,0x27};

float fTemp;

uint8_t *temp2 = (uint8_t *) &fTemp;
for (int i = 0; i < sizeof(float); i++)
    temp2[i] = ptr[3-i];

std::cout<<"Data1: "<<fTemp;

答案 5 :(得分:0)

唯一可移植的方法是分析位模式并形成浮动手动继承到ieee-754浮点的所有规则:

#define BIAS 150
unsigned char ptr[4] = {0x42,0x4c,0xe0,0x27};
// take care of endianness, which may vary between native float and native int
uint32_t tmp = (ptr[0] << 24) | (ptr[1] << 16) | (ptr[2] << 8) | ptr[3];
uint32_t sign = tmp >> 31;
uint32_t exp = (tmp >> 23) & 0xff;
uint32_t mantissa = tmp & ((1 << 23) - 1);
float result;
if (exp > 0)
   mantissa |= (1 << 23);                        // Handle denormals && Inf

// all integers < 16777216 can be represented exactly as a float
// multiply that by a power of two

result = ldexpf((float)mantissa, exp - BIAS);    // in <math.h>

if (exp == 255 && mantissa != 0)  // Produce NaN from Inf-Inf
   result = (result - result);

if (sign) result = -result;       // Flip sign (also handles -0.0f)