先上代码:
#include <iostream>
using namespace std;
int main()
{
	int a[] = {1,2,3};
	double *p = reinterpret_cast<double *>(&a[0]);
	*p  = 5;
	cout << a[0]<<"   "<<a[1]<<"  "<< a[2]<<endl ;
	return 0;
}


想了好久都没有得到答案,在CSDN上问了该问题但是解释不是很好,所以经过不自己懈的思索,突然灵光一现,思路来了,
然后照着自己的思路研究了一番,收获很大,查了一些资料,终于知道了,分析如下:
首先我想说:对于什么类型的指针存储的都是一个地址,本质区别就是根据指针取相应的数据时被解释为相应的类型
所以double *p = reinterpret_cast<double *>(&a[0]);用double 指针指向了整型数组首地址,当用*p去得到相应地址中的数据时,
会把地址中的数据解释为double 类型,因此在进行  *p = 5时, 会把数组的前两个字节总共八个字节当作为double的5.0存储,
即:5.0的二进制存储为:(自行上网搜索浮点型的存储方式在此不多赘述或者我的前一篇博客http://blog.csdn.net/qq_36675830/article/details/76038639)
0(符号位)     10000000001(指数位)     0100000000000000000000000000000000000000000000000000(指数位)  
又由于小端存储 所以  后三十二为位放在前面,前三十二位放在后面,即可得到 a[0] = 0, a[1] = 1075052544 ,a[3] = 3没有变 .

所以输出结果为:0  1075052544  3 意想不到吧,,真是想说一句小代码大智慧 哈哈哈


Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐