打印
[信息]

C语言编程单片机的操作符

[复制链接]
790|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xuanhuanzi|  楼主 | 2018-3-18 09:02 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
这些操作符很有用,特别是在单片机的库函数里,到处都是,各种逻辑操作,位操作
算术操作符
算术操作符包括+、-、×、/和%,当运算结果超过了数据类型的表示范围时会发生溢出。

void main(void)
{
unsigned char i=255;
unsigned char n=0;
int m=0;
n=i+1;
m=i+1;
printf("sum is %d\r\n",n);
printf("sum is %d\r\n",m);
}
执行结果: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) 位与(&)
位与基本用途是清除某个位或某些位,示例代码如下:
UINT32 i=0xFF000000;
i &=0x0FFFFFFF;

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

使用特权

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

使用特权

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

使用特权

评论回复
6
xuanhuanzi|  楼主 | 2018-3-18 09:12 | 只看该作者
左移操作符(<<)
将操作数向左移n 位,右边空出的位补0,左边移出的位被舍弃,可以用来设置寄存器的位。
UINT32 i=0x10;
i <<=4;

使用特权

评论回复
7
xuanhuanzi|  楼主 | 2018-3-18 09:12 | 只看该作者
右移操作符(>>)
将操作数右移n 位,移出的位被舍弃,对于无符号数左边补0,有符号数补1。
UINT32 i=0x10000;
i >>=4;

使用特权

评论回复
8
xuanhuanzi|  楼主 | 2018-3-18 09:14 | 只看该作者
求反(~)
可以直接做位取反,取反是反补码取返。
int x=-20;
1000 0000 0001 0100:原码-20
1111 1111 1110 1100:补码-20
0000 0000 0001 00 11:补码取反19


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

使用特权

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

正整数的原码,反码,补码是相通的。
负整数的原码符号位不变,其他位取反得到反码,然后反码+1得到补码,如果有溢出则高位舍弃。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

173

主题

2211

帖子

3

粉丝