2.1 C51的数据类型
基本数据类型
- 整型:
- 定义:用于存储整数。在C51中,整型数据根据其占用内存空间的大小和是否有符号分为多种类型,常见的有
signed int
(有符号整型)和 unsigned int
(无符号整型)。
- 存储和取值范围:
signed int
通常占用2个字节(16位),其取值范围是 -32768 到 32767 。这是因为最高位被用作符号位,0表示正数,1表示负数,采用补码形式表示负数。unsigned int
同样占用2个字节,但所有位都用于表示数值,所以取值范围是 0 到 65535 。例如:
signed int num1 = -10;
unsigned int num2 = 50000;
- 字符型:
- 定义:用于存储单个字符,用
char
关键字表示。实际上,字符在计算机中是以对应的ASCII码值形式存储的,本质上是一个整数。
- 存储和取值范围:
char
类型通常占用1个字节(8位)。分为 signed char
和 unsigned char
。signed char
的取值范围是 -128 到 127 ,unsigned char
的取值范围是 0 到 255 。例如:
char ch = 'A';
- 浮点型:
- 定义:用于表示带有小数部分的实数。C51中常用的浮点型有
float
(单精度浮点型)。
- 存储和取值范围:
float
类型通常占用4个字节(32位),它可以表示大约7位有效数字,取值范围非常大。例如:
float f = 3.14159f;
特殊数据类型(针对51单片机的存储类型)
- 存储类型:C51针对51单片机的不同存储区域,定义了特殊的存储类型关键字。
- data:表示数据存储在单片机内部的直接寻址RAM区,访问速度最快,通常用于频繁访问的变量。例如:
data char flag;
- **bdata**:表示数据存储在单片机内部的可位寻址RAM区,允许按位操作变量。例如:
bdata int status;
sbit bit_status = status^0;
- **idata**:表示数据存储在单片机内部的间接寻址RAM区,访问速度比 `data` 稍慢,但比外部RAM快。例如:
idata int buffer[10];
- **pdata**:表示数据存储在单片机外部的页寻址RAM区,通过MOVX @Ri指令访问,适用于外部RAM容量较大且需要分页管理的情况。例如:
pdata char ext_data;
- **xdata**:表示数据存储在单片机外部的扩展RAM区,访问速度相对较慢,但容量较大。例如:
xdata int large_array[100];
- **code**:表示数据存储在程序存储器(ROM)中,用于存放常量数据,如程序代码、常量数组等。例如:
code char welcome_msg[] = "Welcome!";
2.2 C51的运算符与表达式
算术运算符
- 定义和用法:用于执行基本的数学运算,包括加(
+
)、减(-
)、乘(*
)、除(/
)和取余(%
)运算符。例如:
int a = 5, b = 3;
int sum = a + b;
int product = a * b;
int quotient = a / b;
int remainder = a % b;
- 注意事项:除法运算中,如果两个操作数都是整数,结果将是整数,小数部分会被截断。取余运算要求两个操作数都必须是整数。
关系运算符
- 定义和用法:用于比较两个操作数的大小关系,返回结果为逻辑值(真或假)。常见的关系运算符有大于(
>
)、小于(<
)、大于等于(>=
)、小于等于(<=
)、等于(==
)和不等于(!=
)。例如:
int a = 10, b = 20;
bit result1 = a > b;
bit result2 = a == b;
- 注意事项:在C语言中,逻辑值真用非零值表示,假用0表示。关系运算符的优先级低于算术运算符。
逻辑运算符
- 定义和用法:用于对逻辑值进行操作,包括逻辑与(
&&
)、逻辑或(||
)和逻辑非(!
)。逻辑与运算符要求两个操作数都为真时结果才为真;逻辑或运算符只要有一个操作数为真结果就为真;逻辑非运算符将操作数的逻辑值取反。例如:
int a = 5, b = 10;
bit result1 = (a > 0) && (b < 20);
bit result2 = (a < 0) || (b > 0);
bit result3 =!(a == b);
- 注意事项:逻辑运算符具有短路特性。例如在
a && b
中,如果 a
为假,就不会再计算 b
;在 a || b
中,如果 a
为真,就不会再计算 b
。
位运算符
- 定义和用法:用于对二进制位进行操作,包括按位与(
&
)、按位或(|
)、按位异或(^
)、按位取反(~
)、左移(<<
)和右移(>>
)。例如:
unsigned char a = 0x05;
unsigned char b = 0x03;
unsigned char result1 = a & b;
unsigned char result2 = a