这两天在调试一个比较复杂的程序,源代码如下:
unsigned long Peek(long address )
{
unsigned long value;
//if( address != PokePointer )
{SetAddress( address );}
//if( PeekPointer >= PeekLimit )
//{throw “Peek addressing error!”;}
value += Read_Register( DATA_A ) << 24;
value += Read_Register( DATA_B ) << 16;
value += Read_Register( DATA_C ) << 8;
value +=Read_Register( DATA_D );
//PeekPointer++; /* maintain local pointer */
return value;
}
Read_Register( DATA_A ) 回来的数据都是字节型的,不知有没有人能预言出PPEK()函数的运转成果,明显这个函数内部存在着一个初级的过错,由于字节型的数据左移8位一切位将都会变成0!因此PPEK函数回来的只要Read_Register( DATA_D );那么正确的应该是什么样呢?我的改正如下:
value += Read_Register( DATA_A );
value =(value<<8) + Read_Register( DATA_B );
value =(value<<8) + Read_Register( DATA_C );
value =(value<<8) + Read_Register( DATA_D );
或许:
value +=(unsigned long)Read_Register( DATA_A ) << 24;
value +=(unsigned long)Read_Register( DATA_B ) << 16;
value +=(unsigned long)Read_Register( DATA_C ) << 8;
value +=(unsigned long)Read_Register( DATA_D );
从以上自己所犯的初级过错,我得出一个定论便是在写代码的时分左移右移必定要注意被移数据的类型也便是他的位数,是否在操作中会导致数据溢出!
再弥补一下:左移<<、右移>>的优先级相对于数学运算是比较低的,我们看一下下面的表达式:
c=a<<8+b;//那么这句的意思便是将a左移8+b位然后赋给c
那么你要实现将a左移8位然后加上b的值赋给c的话就应该写成如下表达式:
c=(a<<8)+b;
以上都是自己犯过的初级过错,期望看到的能引以为戒!!!