先上代码:
想了好久都没有得到答案,在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没有变 .
#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 意想不到吧,,真是想说一句小代码大智慧 哈哈哈