[信息] C语言编程单片机的操作符

[复制链接]
929|8
 楼主| xuanhuanzi 发表于 2018-3-18 09:02 | 显示全部楼层 |阅读模式
这些操作符很有用,特别是在单片机的库函数里,到处都是,各种逻辑操作,位操作
算术操作符
算术操作符包括+、-、×、/和%,当运算结果超过了数据类型的表示范围时会发生溢出。

  1. void main(void)
  2. {
  3. unsigned char i=255;
  4. unsigned char n=0;
  5. int m=0;
  6. n=i+1;
  7. m=i+1;
  8. printf("sum is %d\r\n",n);
  9. printf("sum is %d\r\n",m);
  10. }
执行结果:n=0(相应的CPSR 中Z=1,C=1),m=256。


 楼主| xuanhuanzi 发表于 2018-3-18 09:02 | 显示全部楼层
关系操作符
关系操作符和操作数构成了一个逻辑表达式,这个逻辑表达式可以作为逻辑操作符的操作数,如
if( x < SCR_XSIZE && y < SCR_YSIZE )。


逻辑操作符
逻辑操作符包括与(&&)、或(||)和非(!)。

 楼主| xuanhuanzi 发表于 2018-3-18 09:06 | 显示全部楼层
位操作符
位操作符用于操作整数值的位(可以操作的最小数据单位),理论上可以用位运算完成所有的运算和
操作。位操作符在嵌入式开发中最为常用,来对变量或寄存器进行位操作,从而控制硬件,有效地提高程
序运行的效率。
1) 位与(&)
位与基本用途是清除某个位或某些位,示例代码如下:
  1. UINT32 i=0xFF000000;
  2. i &=0x0FFFFFFF;

比如我们想把BIT0的状态清理掉,我们不知道这个位置是什么,但是需要重新设置。
i&=~BIT0;
这个操作,就是把BIT0对应的位置变成0,其他变成1后,跟i逻辑与操作,这样,i的BIT0对应的位置就会被清零了,其他位置保持不变。

 楼主| xuanhuanzi 发表于 2018-3-18 09:08 | 显示全部楼层
位或(|)
位或基本用途是设置某个位或某些位,示例代码如下:
  1. UINT32 i=0xFF000000;
  2. i |=0x000FFFFF;
这个操作方便让指定的位置变成1,其他位置保持不变。
比如i的BIT0位置。
i|=BIT0;
这个操作会让i的BIT0位置变成1,不管之前是多少,而其他位置保持不变,因为是0的位置遇到0还是0,1的位置遇到0还是1.

 楼主| xuanhuanzi 发表于 2018-3-18 09:11 | 显示全部楼层
位异或(^)
把两个操作数中对应位的值相异的位置1。
  1. UINT32 i=0xFF000000;
  2. i ^=0x0FFFFFFF;
这个操作很有趣,就是把指定位置的数据取反了
比如
i^=BIT0;
在i的BIT位置的数据如果是1,那么因为跟BIT0一样了,变成0,如果是0跟BIT0不同了,变成1.
其他的位置如果是0遇到了0还是0,其他位置是1遇到了0,还是1.
这个操作可以方便对IO口某个位进行取反,高低电平交替。

 楼主| xuanhuanzi 发表于 2018-3-18 09:12 | 显示全部楼层
左移操作符(<<)
将操作数向左移n 位,右边空出的位补0,左边移出的位被舍弃,可以用来设置寄存器的位。
  1. UINT32 i=0x10;
  2. i <<=4;
 楼主| xuanhuanzi 发表于 2018-3-18 09:12 | 显示全部楼层
右移操作符(>>)
将操作数右移n 位,移出的位被舍弃,对于无符号数左边补0,有符号数补1。
  1. UINT32 i=0x10000;
  2. i >>=4;

 楼主| xuanhuanzi 发表于 2018-3-18 09:14 | 显示全部楼层
求反(~)
可以直接做位取反,取反是反补码取返。
  1. int x=-20;
  2. 1000 0000 0001 0100:原码-20
  3. 1111 1111 1110 1100:补码-20
  4. 0000 0000 0001 00 11:补码取反19


计算机里存负数是用补码表示的,取反是反补码取返,如上所示,补码取反,连符号位一起变反,成
了19。

 楼主| xuanhuanzi 发表于 2018-3-18 09:17 | 显示全部楼层
这里介绍一下补码
计算机中的符号数有三种表示方法,即原码、反码和补码。三种表示方法均有符号位和数值位两部分,符号位都是用0表示“正”,用1表示“负”,而数值位,三种表示方法各不相同。
在计算机系统中,数值一律用补码来表示和存储。原因在于,使用补码,可以将符号位和数值域统一处理;同时,加法和减法也可以统一处理。此外,补码与原码相互转换,其运算过程是相同的,不需要额外的硬件电路。

正整数的原码,反码,补码是相通的。
负整数的原码符号位不变,其他位取反得到反码,然后反码+1得到补码,如果有溢出则高位舍弃。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

183

主题

2322

帖子

3

粉丝
快速回复 在线客服 返回列表 返回顶部