几行代码道出了指针,类型转换,浮点存储,小端存储的本质

来源:互联网 发布:女生做春梦 知乎 编辑:程序博客网 时间:2024/05/29 15:34
先上代码:
#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 意想不到吧,,真是想说一句小代码大智慧 哈哈哈


原创粉丝点击