从单片机基础到程序框架(全集 2019pdf版).pdf - 第118页
直接复制前 面章节中第十 一节的模板程 序, 练习代码时只需要 更改 “ C 语言学习区 域” 的 代码就可 以了, 其它 部分的 代码 不要动 。编 译后 ,把程 序下 载进带 串口 的 51 学 习板, 通过 电脑 端的串 口助 手软件 就可 以观 察到不同的 变量数值,详 细方法请看第 十一节 内容。

在电脑串口助手软件上观察到的程序执行现象如下:
开始...
第 1 个数
十进制:255
十六进制:FF
二进制:11111111
第 2 个数
十进制:1
十六进制:1
二进制:1
第 3 个数
十进制:0
十六进制:0
二进制:0
第 4 个数
十进制:1
十六进制:1
二进制:1
第 5 个数
十进制:2
十六进制:2
二进制:10
第 6 个数
十进制:3
十六进制:3
二进制:11
第 7 个数
十进制:2
十六进制:2
二进制:10
分析:
通过实验结果,发现在单片机上的计算结果和我们的分析是一致的。
【27.8 如何在单片机上练习本章节 C 语言程序?】
直接复制前面章节中第十一节的模板程序,练习代码时只需要更改“C 语言学习区域”的代码就可以了,
其它部分的代码不要动。编译后,把程序下载进带串口的 51 学习板,通过电脑端的串口助手软件就可以观
察到不同的变量数值,详细方法请看第十一节内容。

第二十八节:整除求余。
【28.1 整除求余“%”。】
上一节讲到,求商求余都是属于整除运算,区别是:求商返回商,求余返回余,求商是“/”,求余是“%”。
求余的运算符号恰好就是我们平时常用的百分号“%”,之所以选择百分号作为求余的运算符号,我猜测是因
为,在小于 100%的数据中,如果我们仔细回味一下百分号的分子与分母的关系,其实就隐含了一层淡淡的求
余的味道。
整除求余的通用格式:
“保存变量”=“被除数”% “除数 1” % “除数 2”...% “除数 N”;
跟之前讲的加减运算一样,赋值符号“=”左边的“保存变量”必须是变量,右边的可以是变量和常量
的任意组合。如果右边只有两个参与运算的数据,就是整除求余的常见格式。
整除求余的常见格式:
“保存变量”=“被除数” % “除数” ;
现在深入分析一下整除求余的运算规律。
(1)当除数等于 0 时。
我们都知道,数学运算除数是不允许等于 0 的,如果在单片机中非要让除数为 0,余数会出现什么结果?
我在 keil 的 C51 编译环境试过,发现有一个规律:如果除数是变量的 0,那么余数等于被除数。如果除数是
常量的 0,那么余数等于 1。还有一种特殊的情况是编译不通过的,这种情况是“当被除数是变量,而除数
是常量的 0”。比如:
unsigned char a;
unsigned char b;
unsigned char k=10;
unsigned char y=0; //除数初始化为 0
a=23%y; //除数变量 y 里面是 0,a 的结果等于被除数 23。
b=23%0; //除数是常量 0,b 的结果是 1。
b=k%0; //这种特殊情况编译不通过:被除数是变量,而除数是常量的 0。
平时做项目要尽量避免“除数是 0”的情况,离它越远越好,但是既然除数不能为 0,为什么我非要做
“除数为 0”时的实验呢?意义何在?这个实验的意义是,虽然我知道除数为 0 时会出错,但是我不知道这
个错到底严不严重,会不会导致整个程序崩溃,当我做了这个实验后,我心中的石头才放下了,万一除数为
0 时,最多只是运算出错,但是不至于整个程序会崩溃,这样我心里就有了一个底,当哪天我某个程序崩溃
跑飞时,我至少可以排除了“除数为 0”这种情况,引导我从其它方面去找 bug。
(2)当被除数小于除数时。余数等于被除数本身。比如:
unsigned char c;
c=7%10; //c 的结果是 7。
(3)当被除数等于除数时。余数等于 0。比如:
unsigned char d;
d=10%10; //d 的结果是 0。