visual将浮点数转换为32位十六进制的c++

visual Converting float to 32-bit hexadecimal C++

本文关键字:十六进制 c++ 32位 浮点数 转换 visual      更新时间:2023-10-16

谁能告诉我是否有任何代码将浮点数转换为十六进制格式?

For Ex: float num = 70.482和十六进制函数应该返回428CF6C9。

如果在此之前有任何代码已经完成,请链接我。

欢呼。

你可以自己简单地写:

float x;
const unsigned char * pf = reinterpret_cast<const unsigned char*>(&x);
for (size_t i = 0; i != sizeof(float); ++i)
{
  // ith byte is pf[i]
  // e.g. printf("0x02X ", pf[i]);
}

实际上,您可以这样做以获得任何 (standard-layout*)变量的二进制表示。

*)谢谢,@R。Martinho费尔南德斯!

如果您决定在long double(或者更确切地说,是80位扩展精度浮点数)上尝试此操作,请注意它只有10个字节,但在x86/x64上分别填充为12或16。

这是我使用的floattohex转换。(它也执行位交换,如果你不需要这个,把它拿出来)

CString Class::FloatToHex(float* yourfloat)
{
unsigned char ch[4];
Cstring output;
memcpy(ch,yourfloat,sizeof(float));
output.Format("%X%X%X%X",ch[3],ch[2],ch[1],ch[0]);
return output;
}

考虑:

union float_bits {
    unsigned int i;
    float f;
} bits;

将浮点数赋值给bits.f,然后将整数值解释为无符号整数并用bits.i读取。通过这样做,浮点数表示字节将保持完整,并且不会像将浮点数分配给int类型变量时那样进行隐式类型转换。在本例中,我们假定整型的大小与浮点数的大小相同。

或者你可以这样做:

float f;
char *c = (char *) &f;

然后通过c[index]访问f的单个字节。

float f = 70.482f;
int i = *(reinterpret_cast<int*>(&f));
printf("%08xn", i);

您可以使用union:

union FloatToChar {
    float f;
    char  c[sizeof(float)];
};
FloatToChar x;
x.f = 10.42f;
for (size_t i=0; i<sizeof(float); i++)
    printf( "%X", x.c[i] );

也可以这样做,反之亦然

直接使用sprintf(): http://www.cplusplus.com/reference/clibrary/cstdio/sprintf/

例如,

char out[8];
float myFloat = 70.482;
sprintf(out,"%X",myFloat);