当前位置:   article > 正文

四行代码实现C++/C 浮点数转换为IEEE754十六进制表示_mfc c++ 浮点数转换为十六进制数原理

mfc c++ 浮点数转换为十六进制数原理

代码

先上代码,如果是C语言则用注释中的一行替换hvalue的初始化即可。

  1. string float2hex(float num)
  2. {
  3. unsigned int* hvalue = reinterpret_cast<unsigned int*>(&num);
  4. // (C语言) unsigned int* hvalue = (unsigned int*)&num;
  5. char ptr[32] = {};
  6. snprintf(ptr, 32, "%X", *hvalue);
  7. return ptr;
  8. }

原理解释

下面解释这一段转换代码的原理

第一行:

 unsigned int* hvalue = reinterpret_cast<unsigned int*>(&num);

        首先将输入的浮点数num的地址强制转换成一个指向无符号整数(unsigned int)类型的指针hvalue,这样可以让程序将num的二进制表示当作一个整数来处理。

        将float类型的num数据转换为unsigned int类型, 这里使用unsigned int有个好处,就是在使用移位的时候不需要考虑符号位,移位时可视为逻辑移位,而不是算术移位,不过在这段代码中并不涉及到这个问题。

        注意(误区)不能使用下面这种类型的代码来将float转换成整数类型,否则会出现类型转换而导致内存地址中num的数据与hvalue中的数据不同。举一个简单理解但是不太正确的例子,例如当num=0.2f时,int_num的值会在num的基础上舍去小数位,int_num的值就会变成0,这个时候hvalue指针指向的内存地址的值就和float类型,即num的内存地址的值不同了。

unsigned int int_num = (unsigned int)num;
unsigned int* hvalue = &int_num;

第二行,第三行,第四行:

char ptr[32] = {};
snprintf(ptr, 32, "%X", *hvalue);
return ptr;

        因为我们这里使用是是float,而float在计算机中是用32个bit来存储的,因此我们在这里创建一个长度为32的字符数组ptr,并将其所有元素初始化为0,用于存储最终的16进制字符串。

        使用C标准库函数snprintf将hvalue转换为16进制字符串,并将结果存储到ptr中。具体来说,%X格式控制符指定了输出的值为16进制格式,其中X表示输出的字母大写。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/258392
推荐阅读
相关标签
  

闽ICP备14008679号