一个内存数据相减运算的思考

您所在的位置:网站首页 c语言内存地址相减 一个内存数据相减运算的思考

一个内存数据相减运算的思考

2023-07-22 17:17| 来源: 网络整理| 查看: 265

有一块内存区域,其中某两个地址开始的地方存有两个32位的无符号整型,现在用程序如何把它们的差相减出来?

一刚开始想,这有何难?写一个函数就搞写了呗,象这样传入第一地址、第二个地址:

INT32U MemSub(INT32U* src1,INT32U* src2) {

// INT32U* tmp1=(INT32U*)src1; // INT32U* tmp2=(INT32U*)src2; // return *tmp1-*tmp2; INT32U temp32=0; temp32=*src1-*src2;//src1=D249,*D249=32824;src2=D239,*D239=32818;但为什么temp32=1425??? return temp32; }

如以上注释所说,如果不运行的话,也许永远发现不了这种奇怪的错,刚开始我是用前三句,发现结果不对,后来改

成后三句的形形式,还是不对,为什么?

  经过调试跟踪,发现IAR编译器显示的值是正确的,如注释上所说,而且查看了这两个地址的内容,确实是32824和

32818,但为什么相减后结果不对呢?按理说,src1、src2为两个地址,而用*src1、*src2取内容运算,应该可以得

到相应的32位整数,而且编译器780KOR所显示的值确实也没变,但相减后结果还是不对。

  经过反复试验,程序改成下面的形式:

INT32U MemSub(INT32U* src1,INT32U* src2) { INT32U temp1=0; INT32U temp2=0; INT32U temp32; temp1=*src1;//temp1=0x00803800 temp2=*src2;//temp2=0x0080326F temp1=*(INT32U*) src1;//temp1=0x00803800 temp2=*(INT32U*) src2;//temp2=0x0080326F temp1=(INT32U) *src1;//temp1=0x00803800 temp2=(INT32U) src2;//temp2=0x000FD239 *&temp1= *src1; *(&temp2)=* src2;//temp2=0x0080326F //&temp1=src1; INT32U* p1=src1; INT32U* p2=src2; temp32=*p1-*p2;//temp32=1425??? temp1=*p1; temp2=*p2; temp32=*p1-*p2; memcpy(&temp1,src1,4); memcpy(&temp2,src2,4); temp32=temp1-temp2; return temp32; }

  最后还是想不明白,是IAR编译器的问题,还是所用的语句不对,暂时还没有用其它语言验证过。只有用后面4个语

句才能得到正确的结果,上面用了(INT32U)强制转换了还是得到的内容和指定的地址的内容不一样,没办法,只有

强制复制过来先用着,再慢慢研究。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3