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

先上代码:
#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 意想不到吧,,真是想说一句小代码大智慧 哈哈哈


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值