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

来源:本站
导读:目前正在解读《C语言中数据的左移右移应用》的相关信息,《C语言中数据的左移右移应用》是由用户自行发布的知识型内容!下面请观看由(电工技术网 - www.9ddd.net)用户发布《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;

以上都是本人犯过的低级错误,希望看到的能引以为戒!!!

提醒:《C语言中数据的左移右移应用》最后刷新时间 2024-03-14 01:01:30,本站为公益型个人网站,仅供个人学习和记录信息,不进行任何商业性质的盈利。如果内容、图片资源失效或内容涉及侵权,请反馈至,我们会及时处理。本站只保证内容的可读性,无法保证真实性,《C语言中数据的左移右移应用》该内容的真实性请自行鉴别。