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


有一块内存区域,其中某两个地址开始的地方存有两个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)强制转换了还是得到的内容和指定的地址的内容不一样,没办法,只有

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


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值