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