我有符号位,指数和尾数(如下面的代码所示)。我试图获取此值并将其转换为浮点数。这样做的目的是获取59.98
(它将被视为59.9799995
)
uint32_t FullBinaryValue = (Converted[0] << 24) | (Converted[1] << 16) |
(Converted[2] << 8) | (Converted[3]);
unsigned int sign_bit = (FullBinaryValue & 0x80000000);
unsigned int exponent = (FullBinaryValue & 0x7F800000) >> 23;
unsigned int mantissa = (FullBinaryValue & 0x7FFFFF);
我最初尝试做的只是一点一点地放置它们,它们应该如此:
float number = (sign_bit << 32) | (exponent << 24) | (mantissa);
但这给了我2.22192742e+009.
然后我将使用公式:1.mantissa + 2^(exponent-127)
但你不能在二进制数字中加上小数位。
然后我尝试抓住每个单独的值(指数,特征,后尾数)并且我得到了
Characteristic: 0x3B (Decimal: 59)
Mantissa: 0x6FEB85 (Decimal: 7334789)
Exponent: 0x5 (Decimal: 5) This is after subtracting it from 127
然后我将采用这些数字并将其改装成printf。但是,我不知道如何将尾数十六进制转换为它应该如何(由负指数驱动)。
有关如何将这三个变量(符号位,指数和尾数)转换为浮点数的任何想法?
编辑PAUL R
以下是Minimal,Complete和Verifable格式的代码。
我添加了uint8_t Converted[4]
只是因为它是我最终得到的值,它使它可以运行。
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
int main(int argc, char *argv[])
{
uint8_t Converted[4];
Converted[0] = 0x42;
Converted[1] = 0x6f;
Converted[2] = 0xEB;
Converted[3] = 0x85;
uint32_t FullBinaryValue = (Converted[0] << 24) | (Converted[1] << 16) |
(Converted[2] << 8) | (Converted[3]);
unsigned int sign_bit = (FullBinaryValue & 0x80000000);
unsigned int exponent = (FullBinaryValue & 0x7F800000) >> 23;
unsigned int mantissa = (FullBinaryValue & 0x7FFFFF);
float number = (sign_bit) | (exponent << 23) | (mantissa);
return 0;
}
答案 0 :(得分:4)
问题是表达式float number = (sign_bit << 32) | (exponent << 24) | (mantissa);
首先计算unsigned int
,然后将该值转换为float
。基本类型之间的转换将保留值而不是内存表示。您要做的是将内存表示重新解释为不同的类型。您可以使用reinterpret_cast
。
请改为尝试:
uint32_t FullBinaryValue = (Converted[0] << 24) | (Converted[1] << 16) |
(Converted[2] << 8) | (Converted[3]);
float number = reinterpret_cast<float&>(FullBinaryValue);