单片机运算符及表达式

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

第三章运算符及表达式

说明:Cx51的运算符与普通C语言的几乎完全一样,带复习性质,重点介绍在单片机中应用的特点。

一、运算符及表达式

运算符:完成某种特定运算的符号。运算符按其表达式中与运算符的关系可分为单目运算符,双目运算符和三目运算符。单目就是指需要有一个运算对象,双目就要求有两个运算对象,三目则要三个运算对象。

运算对象:在程序运行时,有数值或有数值传递给它。

表达式:表达式则是由运算符及运算对象所组成的具有特定含义的式子。C是一种表达式语言,表达式后面加;号就构成了一个表达式语句。

例:x=a*(b+c-a);

子表达式:成对的括号以及在它们之间的全部符号组成的表达式。上例中

(b+c-a)就是子表达式。

二、运算符

1、赋值运算符

1) 赋值运算符

赋值符号“=”完成的操作即为赋值运算,它是右结合性,且优先级最低。

2) 赋值表达式

将一个变量与表达式用赋值号连接起来就构成赋值表达式。形式如下:

变量名=表达式

赋值表达式中的表达式包括变量、算术运算表达式、关系运算表达式、逻辑运算表达式等,甚至可以是另一个赋值表达式。赋值过程是将“=”右边表达式的值赋给“=”左边的一个变量,赋值表达式的值就是被赋值变量的值。

例如:

a=(b=4)+(c=6);,该表达式的值为10,变量a 的值为10。

3) 赋值的类型转换规则

在赋值运算中,当“=”两侧的类型不一致时,要将数据转换成同一数据类型,转换的方式有两种,一种是系统自动转换,一种是强制转换。

(1)系统自动转换

编译时,将右边表达式的值转换成左侧变量的类型,再赋给该变量。转换规则如下:

①实型数据赋给整型变量时,舍弃小数部分。

②整型数据赋给实型变量时,数值不变,但以IEEE 浮点数形式存储在变量中。

③长字节整型数据赋给短字节整型变量时,实行截断处理。如将long 型数据赋给int型变量时,将long 型数据的低两字节数据赋给int 型变量,而将long 型数据的高两字节的数据丢弃。

④短字节整型数据赋给长字节整型变量时,进行符号扩展。如将int 型数据赋给long型变量时,将int 型数据赋给long 型变量的低两字节,而将long 型变量的高两字节的每一位都设为int 型数据的符号值。

)强制转换2(.

使用强制类型转换运算符转换:

(类型名) (表达式);

将表达式的数据类型转换为前面要求的类型名。

例1:x=(float)a;

y=(int)(x+y);

例2:unsigned char x,y;

unsigned int z;

z=x+(unsigned int)y;

4)应用

在单片机中,经常要给寄存器、I/O口赋值:

(1) P1=0xff;//给P1口全置1

(2)P2=0x08; //给P2的第三位置1

(3)TF0=0;//清定时器T0的溢出标志位

(4)sbit P10=P1^0;//注意大写

bit x;

x=P10;

P10=!P10;

2、算术运算符

c语言中的算术运算符有:

+ 加或取正值运算符

- 减或取负值运算符

* 乘运算符

/除运算符

%模(求余)运算符

上面这些运算符中加、减、乘、除为双目运算符,它们要求有两个运算对象。

这些大家已经很熟悉了。

3、关系运算符

c语言中有6种关系运算符:

> 大于

< 小于

>=大于等于

<=小于等于

==等于

=不等于 !.

前4种关系运算符具有相同的优先级,后两种关系运算符也具有相同的优先级;但前4种的优先级高于后2种。

优先级别:

(低)赋值运算符→关系运算符→算术运算符(高)

4、逻辑运算符

逻辑运算符用来求某个条件式的逻辑值。 Cx51提供了3种逻辑运算符:

|| 逻辑或( AND)

&& 逻辑与(OR)

! 逻辑非(NOT)

逻辑表达式:用逻辑运算符将关系表达式或逻辑量连接起来。逻辑表达式的一般形式为:逻辑与:条件式l&&条件式2

逻辑或:条件式l || 条件式2

逻辑非:!条件式

例如:x&&y、a|| b、!z都是合法的逻辑表达式。

逻辑表达式的值是一个逻辑量真或假,0代表假,1代表真。在逻辑运算中,把非0都看作逻

辑1。

例:a=4;b=0;

c=a||b;// c= 1

c=a&&b;//c=0;

c=!a;//c=0;

5、位运算符

1)能对运算对象进行按位操作,C语言中其有6种位运算符:

&按位与

| 按位或

^ 按位异或

~按位取反

<< 左移

>> 右移

位运算符的作用是按位对变量进行运算,并不改变参与运算的变量值。

2)位运算符的优先级从高到低依次是:按位取反(~)→左移(<<)和右移(>>)→按位与(&) →按位异或(^)→按位或(|)。

3)所有位运算符的对象是int或 char数据类型,不能为实数。

4)位运算的应用

例:P1=P1&0xf8;//将P1口的、、清零,其他位不变

st=P0&0x07;//读、、的值,送入变量st

,其他位不变1口的置P1将P1|0x08;//= P1.

P1=(P1&0xbf)|0x04;//给置低电平,置高电平,其

//他位不变

X=a^b//判断a是否与b相等,相等为0

5)位左移和位右移运算符(<<、>>)

位左移、位右移运算符“<<”和“>>”,用来将一个数的各二进制位的全部左移或右移1位;移位后,空白位补0,而溢出的位舍弃。注意汇编语言的区别。

例:若a=EAH=B

则表达式: a=a<<2,将a值左移两位,其结果为A8H。

汇编语言是循环移位,而C语言不是循环移位,但有循环移位的函数

Unsigned char _cror_(unsigned char c, unsigned char c);

上面时循环右移函数,c为待移动字符,b为移动位数。

循环左移函数是:

Unsigned char _crol_(unsigned char c, unsigned char c);

也可以自己编程循环移位。下面讲右循环移位的例子。

例1:若a=B=0C3H,将a值右循环位移两位。对a进行循环右移二位的程序如下:

#include<>

main()

{ unsigned char a=0xc3,b,c,d;

char data n=2;

b=a<<(8-n);//b像左移6位,1、2位到7、8位

c=a>>n;//右移2位

d=c|b;//结果为=0xf0,教材中方法

c=_cror_(a,2);//用库函数实现

相关文档
最新文档