沿途有余弦 2017-06-03 02:31 采纳率: 75%
浏览 825
已采纳

这个偶然看到的不明白,关于两个类型的指针转化问题也是第一次接触

首先,数组a中两个int变量应该是八个字节,看图应该不是我想的(0261,0000)(这个纯属瞎猜哈),5和1是怎么回事?还有转换,两个类型不同的在转换时内存占用大小不一样,怎么处理的?图片

  • 写回答

1条回答

  • 一个纸杯 2017-06-03 03:43
    关注

    这个问题首先你要了解计算机的内存机制,计算机内存一般是按字节存储的(至少我们现在用的pc机都是这样),我们分析的时候经常数字转化为16进制进行分析,因为一位16进制正好是4bit,两位16进制就是一字节,261转化为16进制之后是105,如下:
    图片说明
    然后它在内存中的存储如果按照大端存储,就是下图这样的,我们用的pc机大多是按照大端存储的,就是低字节存在内存的低地址,小端存储相反,不清楚的话自己百度一下:
    图片说明
    看到这应该很明白了吧。

    cout<<*(int*)p++<<endl;
    解释:p指针转化为int型指针,并取内容,也就是说,从p指针指向的地方开始,取int长度个字节,也就是4字节,所以取出来的是00,00,01,05,也就是261的16进制,输出时按照10进制输出的,所以是261
    cout<<*(int*)p<<endl;
    和上一步一样,只是上一步p已经后置自增,所以现在p指向01,所以取出来是00,00,00,01,也就是1的16进制表示(与其十进制表示一样),所以输出1。
    cout<<(int)*p<<endl;
    这一步是将p指向的内容取出来,记住p是一个char型指针,一直都没有改变,所以只取一个字节,也就是01,(int)部分是将它扩展为4字节,这采用的应该是符号扩展(这是数字逻辑或计算机组成原理的知识,不清楚请自行百度),因为是正数,所以前面添0就行,扩展之后是00,00,00,01,和上一步一样,输出1。
    cout<<(int)*(char*)pi<<endl;
    这一步看着很绕,其实都是纸老虎,首先pi是一个int型指针,指向的是05,先将它转外为char型指针并取其内容,也就是只取一个字节内容,就是05,然后将其转化为int型的值,也是符号扩展,前面加0,扩展之后是00,00,00,05,再将这16进制转化为十进制,就是5。

    需要注意的是,指针操作,类型转换操作,应该考虑操作的优先级,这四个转化中,都是自后向前的。

    祝你学习愉快,纯手打,求悬赏。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 微信公众号自制会员卡没有收款渠道啊
  • ¥15 stable diffusion
  • ¥100 Jenkins自动化部署—悬赏100元
  • ¥15 关于#python#的问题:求帮写python代码
  • ¥20 MATLAB画图图形出现上下震荡的线条
  • ¥15 关于#windows#的问题:怎么用WIN 11系统的电脑 克隆WIN NT3.51-4.0系统的硬盘
  • ¥15 perl MISA分析p3_in脚本出错
  • ¥15 k8s部署jupyterlab,jupyterlab保存不了文件
  • ¥15 ubuntu虚拟机打包apk错误
  • ¥199 rust编程架构设计的方案 有偿