8051单片机C语言运算符详解:掌握运算与逻辑的精髓
发布时间: 2024-07-07 11:05:31 阅读量: 75 订阅数: 21
![8051单片机c程序设计完全手册](https://www.applify.com.sg/blog/wp-content/uploads/2023/06/Home-Automation-Development-1024x576-2.jpg)
# 1. 8051单片机C语言运算符概述
运算符是C语言中用于执行各种运算的符号。它们可以对变量、常量或表达式进行操作,从而产生新的值。8051单片机C语言支持多种运算符,包括算术运算符、逻辑运算符、关系运算符、位移运算符等。这些运算符在程序设计中扮演着至关重要的角色,用于执行各种计算、比较和逻辑操作。
# 2. 算术运算符
算术运算符用于对数值进行算术运算,包括整数和浮点数。
### 2.1 整数运算符
整数运算符用于对整数类型的数据进行运算。
#### 2.1.1 加法和减法
加法运算符(+)将两个整数相加,减法运算符(-)将一个整数从另一个整数中减去。
```c
int a = 10;
int b = 5;
int c = a + b; // c = 15
int d = a - b; // d = 5
```
#### 2.1.2 乘法和除法
乘法运算符(*)将两个整数相乘,除法运算符(/)将一个整数除以另一个整数。除法运算的结果是一个整数,小数部分会被舍弃。
```c
int a = 10;
int b = 5;
int c = a * b; // c = 50
int d = a / b; // d = 2
```
### 2.2 浮点数运算符
浮点数运算符用于对浮点数类型的数据进行运算。
#### 2.2.1 加法和减法
加法运算符(+)将两个浮点数相加,减法运算符(-)将一个浮点数从另一个浮点数中减去。
```c
float a = 10.5;
float b = 5.2;
float c = a + b; // c = 15.7
float d = a - b; // d = 5.3
```
#### 2.2.2 乘法和除法
乘法运算符(*)将两个浮点数相乘,除法运算符(/)将一个浮点数除以另一个浮点数。除法运算的结果是一个浮点数。
```c
float a = 10.5;
float b = 5.2;
float c = a * b; // c = 54.6
float d = a / b; // d = 2.019231
```
# 3.1 按位逻辑运算符
按位逻辑运算符作用于二进制位,对每个二进制位进行逻辑运算。8051 单片机中提供了三种按位逻辑运算符:与运算(&)、或运算(|)和异或运算(^)。
#### 3.1.1 与运算(&)
与运算符(&)将两个操作数的二进制位逐位进行与运算。如果两个二进制位都为 1,则结果为 1;否则,结果为 0。
```c
uint8_t a = 0b1101;
uint8_t b = 0b1010;
uint8_t result = a & b; // result = 0b1000
```
**逻辑分析:**
* 0b1101 & 0b1010
* 1 & 1 = 1
* 1 & 0 = 0
* 0 & 1 = 0
* 0 & 0 = 0
因此,result 的二进制值为 0b1000,十进制值为 8。
#### 3.1.2 或运算(|)
或运算符(|)将两个操作数的二进制位逐位进行或运算。如果两个二进制位中至少有一个为 1,则结果为 1;否则,结果为 0。
```c
uint8_t a = 0b1101;
uint8_t b = 0b1010;
uint8_t result = a | b; // result = 0b1111
```
**逻辑分析:**
* 0b1101 | 0b1010
* 1 | 1 = 1
* 1 | 0 = 1
* 0 | 1 = 1
* 0 | 0 = 0
因此,result 的二进制值为 0b1111,十进制值为 15。
#### 3.1.3 异或运算(^)
异或运算符(^)将两个操作数的二进制位逐位进行异或运算。如果两个二进制位不同,则结果为 1;否则,结果为 0。
```c
uint8_t a = 0b1101;
uint8_t b = 0b1010;
uint8_t result = a ^ b; // result = 0b0111
```
**逻辑分析:**
* 0b1101 ^ 0b1010
* 1 ^ 1 = 0
* 1 ^ 0 = 1
* 0 ^ 1 = 1
* 0 ^ 0 = 0
因此,result 的二进制值为 0b0111,十进制值为 7。
# 4. 关系运算符
关系运算符用于比较两个操作数的值,并返回一个布尔值(真或假)。它们通常用于条件语句和循环中,以控制程序流。
### 4.1 等值运算符
等值运算符用于比较两个操作数的值是否相等。
#### 4.1.1 等于(==)
`==` 运算符比较两个操作数的值是否相等。如果相等,则返回 `true`;否则,返回 `false`。
```c
int a = 5;
int b = 5;
if (a == b) {
printf("a and b are equal\n");
}
```
输出:
```
a and b are equal
```
#### 4.1.2 不等于(!=)
`!=` 运算符比较两个操作数的值是否不相等。如果不相等,则返回 `true`;否则,返回 `false`。
```c
int a = 5;
int b = 6;
if (a != b) {
printf("a and b are not equal\n");
}
```
输出:
```
a and b are not equal
```
### 4.2 比较运算符
比较运算符用于比较两个操作数的大小。
#### 4.2.1 大于(>)
`>` 运算符比较第一个操作数是否大于第二个操作数。如果大于,则返回 `true`;否则,返回 `false`。
```c
int a = 5;
int b = 3;
if (a > b) {
printf("a is greater than b\n");
}
```
输出:
```
a is greater than b
```
#### 4.2.2 小于(<)
`<` 运算符比较第一个操作数是否小于第二个操作数。如果小于,则返回 `true`;否则,返回 `false`。
```c
int a = 5;
int b = 7;
if (a < b) {
printf("a is less than b\n");
}
```
输出:
```
a is less than b
```
#### 4.2.3 大于等于(>=)
`>=` 运算符比较第一个操作数是否大于或等于第二个操作数。如果大于或等于,则返回 `true`;否则,返回 `false`。
```c
int a = 5;
int b = 5;
if (a >= b) {
printf("a is greater than or equal to b\n");
}
```
输出:
```
a is greater than or equal to b
```
#### 4.2.4 小于等于(<=)
`<=` 运算符比较第一个操作数是否小于或等于第二个操作数。如果小于或等于,则返回 `true`;否则,返回 `false`。
```c
int a = 5;
int b = 7;
if (a <= b) {
printf("a is less than or equal to b\n");
}
```
输出:
```
a is less than or equal to b
```
# 5. 位移运算符
### 5.1 左移运算符(<<)
左移运算符(<<)将一个数的二进制位向左移动指定位数,相当于将该数乘以 2 的指定次幂。
**语法:**
```c
result = operand << shift_count;
```
**参数:**
* `operand`:要移动的数
* `shift_count`:移动的位数
**逻辑分析:**
左移运算符将 `operand` 的二进制位向左移动 `shift_count` 位。如果 `shift_count` 为正数,则相当于将 `operand` 乘以 2 的 `shift_count` 次幂。如果 `shift_count` 为负数,则相当于将 `operand` 除以 2 的 `-shift_count` 次幂。
**代码示例:**
```c
int num = 5; // 二进制表示为 101
int result = num << 2; // 左移 2 位,相当于乘以 2^2
printf("左移后的结果:%d\n", result); // 输出:20(二进制表示为 10100)
```
### 5.2 右移运算符(>>)
右移运算符(>>)将一个数的二进制位向右移动指定位数,相当于将该数除以 2 的指定次幂。
**语法:**
```c
result = operand >> shift_count;
```
**参数:**
* `operand`:要移动的数
* `shift_count`:移动的位数
**逻辑分析:**
右移运算符将 `operand` 的二进制位向右移动 `shift_count` 位。如果 `shift_count` 为正数,则相当于将 `operand` 除以 2 的 `shift_count` 次幂。如果 `shift_count` 为负数,则相当于将 `operand` 乘以 2 的 `-shift_count` 次幂。
**代码示例:**
```c
int num = 20; // 二进制表示为 10100
int result = num >> 2; // 右移 2 位,相当于除以 2^2
printf("右移后的结果:%d\n", result); // 输出:5(二进制表示为 101)
```
### 位移运算符的应用
位移运算符在计算机编程中广泛应用,例如:
* **位掩码:**使用位移运算符可以对二进制数进行位掩码操作,提取或设置特定位。
* **位字段:**位移运算符可以用于定义和操作位字段,节省内存空间。
* **快速乘除:**左移运算符可以用于快速乘以 2 的次幂,右移运算符可以用于快速除以 2 的次幂。
* **位操作:**位移运算符可以用于进行各种位操作,如设置、清除或反转特定位。
### 位移运算符的优先级和结合性
位移运算符的优先级比算术运算符低,比关系运算符高。位移运算符的结合性是从右到左。
**优先级表:**
| 运算符类型 | 优先级 |
|---|---|
| 括号 () | 最高 |
| 一元运算符 (+、-、!、~、++、--) | 次高 |
| 乘法和除法 (*、/、%) | 中等 |
| 加法和减法 (+、-) | 中等 |
| 位移运算符 (<<、>>) | 中等 |
| 关系运算符 (<、<=、>、>=、==、!=) | 中等 |
| 逻辑运算符 (&、|、^) | 最低 |
| 赋值运算符 (=、+=、-=、*=、/=、%=、&=、|=、^=、<<=、>>=) | 最低 |
**结合性表:**
| 运算符类型 | 结合性 |
|---|---|
| 一元运算符 | 从右到左 |
| 二元运算符 | 从左到右 |
# 6.1 运算符优先级
运算符优先级决定了在表达式中运算符执行的顺序。优先级较高的运算符先执行,优先级较低的运算符后执行。
下表列出了 8051 单片机 C 语言中运算符的优先级(从高到低):
| 运算符 | 优先级 |
|---|---|
| () | 最高 |
| ++、-- | |
| !、~ | |
| *、/、% | |
| +、- | |
| <<、>> | |
| <、<=、>、>= | |
| ==、!= | |
| && | |
| || | 最低 |
例如,在表达式 `a + b * c` 中,乘法运算符 `*` 的优先级高于加法运算符 `+`,因此表达式将首先执行乘法运算,然后执行加法运算。
## 6.2 运算符结合性
运算符结合性决定了当两个或多个相同优先级的运算符出现在表达式中时,运算符执行的顺序。
下表列出了 8051 单片机 C 语言中运算符的结合性(从左到右):
| 运算符 | 结合性 |
|---|---|
| ++、-- | 右结合 |
| !、~ | 右结合 |
| *、/、% | 左结合 |
| +、- | 左结合 |
| <<、>> | 左结合 |
| <、<=、>、>= | 左结合 |
| ==、!= | 左结合 |
| && | 左结合 |
| || | 左结合 |
例如,在表达式 `a + b + c` 中,加法运算符 `+` 具有相同的优先级,并且是左结合的,因此表达式将从左向右执行加法运算。
0
0