资讯详情

C语言中数据的左移右移应用

这两天在调试一个比较复杂的程序,源代码如下:

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; 以上都是本人犯过的低级错误,希望看到的能引以为戒!!! -电子元器件采购网(www.ruidan.com)是本土元器件目录分销商,采用“小批量、现货、样品”销售模式,致力于满足客户多型号、高质量、快速交付的采购需求。 自建高效智能仓储,拥有自营库存超过50,000种,提供一站式正品现货采购、个性化解决方案、选型替代等多元化服务。
锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台