从单片机基础到程序框架(全集 2019pdf版) - 第103页
其它 部分的 代码 不要动 。编 译后, 把程 序下 载进带 串口的 51 学习 板,通 过电 脑端的 串口 助手 软件就 可以 观 察到不同的变量 数值,详 细方法请看第 十一节 内容。

}
/*---C 语言学习区域的结束。-----------------------------------------------*/
在电脑串口助手软件上观察到的程序执行现象如下:
开始...
第 1 个数
十进制:255
十六进制:FF
二进制:11111111
第 2 个数
十进制:253
十六进制:FD
二进制:11111101
第 3 个数
十进制:65535
十六进制:FFFF
二进制:1111111111111111
第 4 个数
十进制:65533
十六进制:FFFD
二进制:1111111111111101
第 5 个数
十进制:2
十六进制:2
二进制:10
第 6 个数
十进制:2
十六进制:2
二进制:10
分析:
通过实验结果,发现在单片机上的计算结果和我们的分析是一致的。
【23.4 如何在单片机上练习本章节 C 语言程序?】
直接复制前面章节中第十一节的模板程序,练习代码时只需要更改“C 语言学习区域”的代码就可以了,

其它部分的代码不要动。编译后,把程序下载进带串口的 51 学习板,通过电脑端的串口助手软件就可以观
察到不同的变量数值,详细方法请看第十一节内容。

第二十四节:借用 unsigned long 类型的中间变量可以减少溢出现象。
【24.1 为什么要借用 unsigned long 类型的中间变量?】
为什么要借用 unsigned long 类型的中间变量进行算术运算?其实就是为了减少溢出的问题。溢出是因
为数据超过了它的最大范围,unsigned char ,unsigned int ,unsigned long 三种数据类型中,unsigned long
的取值是最大的。当参与运算变量中存在非 unsigned long 类型的时候,在运算前,先让每个非 unsigned long
类型的变量借用一个 unsigned long 类型的中间变量,然后才开始运算,可以大大减少运算中的溢出问题。
unsigned long 的取值是从 0 到 4294967295,万一数据超过了 4294967295 怎么办?有两种办法,一种是换
更加高级的 32 位单片机,比如 stm32 单片机就支持 64 位长度的“long long”数据类型,64 位长度的数据
类型基本上可以满足绝大多数涉及运算的项目,还有一种方法思路是可以用 BCD 码的数组方式进行运算,这
种数组运算的方法我以后会跟大家介绍,初学者现在暂时不用深入了解它。
【24.2 如何借用 unsigned long 类型的中间变量?】
借用中间变量的方法是引入中间变量,有多少个非 unsigned long 类型变量就引入多少个 unsigned long
中间变量,再借这个“壳”进行运算,最后再把中间变量的计算结果返回给实际变量。请看下面例子。
转换之前:
unsigned int a;
unsigned char x=195;
unsigned long y=101;
a=x-y; //进行算术减法运算
分析:
上述公式用到 3 个变量,其中 a 和 x 都不是 unsigned long 变量,因此需要为它们分别引入两个 unsigned
long 类型的中间变量 t 和 s,于是乎,继续往下看......
转换之后:
unsigned int a;
unsigned char x=195;
unsigned long y=101;
unsigned long t; //引入的中间变量 t,用来给 a 借用。
unsigned long s; //引入的中间变量 s,用来给 x 借用。
//第一步:使用之前先清零
t=0; //t 在用之前,先把 t 的 32 位全部清零。
s=0; //s 在用之前,先把 s 的 32 位全部清零。
s=x; //s 接收 x 原数据,等效于 x 借用 unsigned long 中间变量 s 这个壳。
t=s-y; //此处 unsigned long 类型的 t 就默认代表了 unsigned int 类型的变量 a。
//第二步:因为其它的变量都是临时的,所以运算结束后再返回计算结果给原来的变量。
a=t; //运算结束后再把计算结果返回给原来的变量 a。