reinterpret_cast加上指针的一道程序题,如下

#include<iostream>usingnamespacestd;intmain(){doublearr[]={1,2,3};int*p=reinterpret_c... #include <iostream>
using namespace std;
int main(){
double arr[]={1,2,3};
int *p=reinterpret_cast<int *>(&arr[0]);
*p=6;
cout<<arr[0]<<" "<<arr[1]<<" "<<arr[2]<<endl;
return 0;
}
为什么结果总是:1,2,3
谢谢!
怎样才能正确地输出6,2,3?
展开
 我来答
TheCppCoder
2014-05-13 · 超过10用户采纳过TA的回答
知道答主
回答量:18
采纳率:0%
帮助的人:22.1万
展开全部
double arr[]={1,2,3};
int *p=reinterpret_cast<int *>(&arr[0]);
*p=6;
cout<<arr[0]<<" "<<arr[1]<<" "<<arr[2]<<endl;
cout << *p << endl ;

*p = 6,因为p是整形指针, 所以用16进制码来操作p指向内存, 所以*p = arr[ 0 ] = 0x0000 0110 = 6

cout << arr[0] 因为arr是浮点指针,所以使用IEEE754编码来解释该内存数据,
因为0x0000 0110 = 1.00000000000003
而cout流默认只打印6个小数点有效位, 所以打印1
beddy1
2014-05-13 · TA获得超过1989个赞
知道大有可为答主
回答量:2271
采纳率:0%
帮助的人:2206万
展开全部
不知道你清楚你在做什么没有,double 在内存中占8个字节的,采用IEEE754标准存储。你的代码相当于是直接改了double 的 末 4个字节为 00 00 00 06 ,实际效果是会得到一个近似1的小数,但比1稍大一点。因为默认只保留6位小数位,所以显示出来还是1而已。
想通过这样的方法得到6,是不可能的。

可以考虑如下的做法,不过我只是在凑数据而已,这样做没意义
*(p + 1) = 0x418;
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式