欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

浮点数和十六进制数的转换

程序员文章站 2022-07-15 13:18:20
...

前言

浮点数和十六进制或者二进制转换的问题,以前没有关注过这类问题,没想到最近在工作当中遇到了,先记录一波。
出现该问题的原因定义了一个unsigned int类型的指针,然后指向了一块由mmap映射上来的虚拟地址,然而后续我往地址写入的值是float类型的,一开始没有注意到指针和传入的值类型是不同的,所以一直找不到问题出在哪里。后来通过检测寄存器相应地址的数值,才发现自己用unsigned int类型的指针指向了一个float的值,因此这里就牵扯出了浮点数和十六进制数之间的转换问题。

浮点数和十六进制的转换

闲言少叙,接下来看一下如何实现浮点数和十六进制数的转化吧。在此之前先介绍一下联合union。
union:联合是将多个成员变量共用一个内存,并且在同一个时刻只能对一个成员进行赋值,当某一个成员被改变时,其他成员也会立即被改变。可见,联合虽然有多个成员,但是由于地址是共用的,地址存放的数据时唯一的,只不过该数据被不同的成员变量用不同的形式展现出来而已。现在就可以利用联合的这个性质来解决浮点数和十六进制转换的问题。
具体代码如下:

#include <iostream>
using namespace std;
union{
	unsigned int x;
	float y;
}u;
int main()
{
	u.y = 3.5;//本例由float转换成十六进制,所以就对y进行赋值
	cout << hex << u.x<< endl;
	return 0;
}

运行结果如下:
浮点数和十六进制数的转换
所以得出3.5用16进制表示就是40600000。
上述代码是由float向十六进制转换的过程,若是想由十六进制到float转换的话就给x赋值即可。
接下来我们再看一下如果是由unsigned int类型的地址指向float的值会怎么样?
具体代码如下:

#include <iostream>
using namespace std;
int main()
{
	unsigned int* p = (unsigned int*)malloc(sizeof(unsigned int));
	float y = 3.5;
	*p = y;//unsigned int 类型指针指向float的值
	cout << *p << endl;
	cout << (unsigned int)y << endl;//类型强制转换
	free(p);
	return 0;
}

运行代码结果如下:
浮点数和十六进制数的转换
可见,由unsigned int类型的指针指向float的值,相当于做了强制类型转换。