赞
踩
先上代码,如果是C语言则用注释中的一行替换hvalue的初始化即可。
- string float2hex(float num)
- {
- unsigned int* hvalue = reinterpret_cast<unsigned int*>(&num);
- // (C语言) unsigned int* hvalue = (unsigned int*)#
-
- char ptr[32] = {};
- snprintf(ptr, 32, "%X", *hvalue);
- return ptr;
- }
下面解释这一段转换代码的原理
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表示输出的字母大写。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。