| 整除求余的运算。 求余跟上一节讲的求商都是属于整除运算,区别是:求余返回余数,求商返回商。整除求余的余数有一个很明显的规律:余数永远小于除数(除数不为0的情况下)。比如,除数是10,那么不管被除数有多大,余数必然是从0到9的数,不可能是10以上的数。上一节提到除法求商的运算符号是“/”,而除法求余的运算符号是“%”,外形跟百分号一致,只是在C语言中用来做除法求余的运算符而已。
 整除求余的通用格式:
 “保存变量”=“被除数”% “除数1” % “除数2”...%  “除数N”;
 跟之前讲的加减运算一样,左边的“保存变量”必须是变量,右边的可以是变量和常量的任意组合。如果右边只有两个参与运算的数据,就是整除求余的常见格式。
 整除求余的常见格式:
 “保存变量”=“被除数” % “除数” ;
 现在从整除求余常见格式的6个方面来分析它的规律。
 (1)当“除数”等于0时。我们都知道,数学运算除数是不允许等于0的,如果在单片机中非要让除数为0,余数会出现什么结果?我在keil的C51编译环境试过,发现有一个规律:如果“除数”是变量的0,那么余数等于被除数。如果“除数”是常量的0,那么余数等于1。还有一种特殊的情况是编译不通过的,就是“被除数”是变量,而“除数”是常量的0。其实大家都知道“除数”不能为0,为什么我非要做“除数”为0时的实验呢?意义何在?我虽然知道除数为0时会出错,但是我不知道这个错到底严不严重,会不会程序崩溃,当我做了这个实验后,我心中的石头才放下了,万一除数为0,只是运算出错,至少程序不会崩溃,这样我心里就有了一个底,当哪天我某个程序崩溃时,我至少可以排除了这种情况,方便我找bug。这就是本实验的意义所在。
 比如:
 a=23%y;  //假设除数变量y里面是0,那么a的结果是23。
 b=23%0;  //除数是常量0,那么b的结果是1。
 b=g%0;  //这种特殊情况编译不通过:“被除数”是变量,而“除数”是常量的0。
 复制代码
 
 
 (2)当被除数小于“除数”时。余数等于被除数本身。比如:
 c=7%10;  //c的结果是7。
 复制代码
 
 (3)当被除数等于“除数”时。余数等于0。比如:
 d=10%10;  //d的结果是0。
 复制代码
 
 
 (4)当被除数大于“除数”时。余数也必然小于“除数”。
 比如:
 e=10%4;  //e的结果是2。
 f=10% 3;  //f的结果是1。
 复制代码
 
 
 (5)自除求余运算的简写。跟前面加减法一样,当“被除数”是“保存变量”时,存在自除求余运算的简写。
 “保存变量”=“保存变量” % “除数” ;
 上述自除运算的简写如下:
 “保存变量” % =“除数” ;
 比如:
 g%=5;  //相当于g=g%5;
 复制代码
 
 加减法有自加1“++g”和自减1“g--”的特殊写法,但是除法不存在这种自除1的特殊写法,因为一个数除以1还是等于它本身,所以自除1没有任何意义,因此C语言语法中没有这种写法。
 (6)除法的溢出规律跟加法的溢出规律是一样的,所以不再多举例子。在实际项目中,为了避免一不小心就溢出的问题,我强烈建议,不管加减乘除,凡是参与运算的变量全部都要转化成unsigned long变量,转化的方法也跟加减运算的转换方法一致,不再详细讲解这方面的内容。
 现在编写一个程序来练习刚才讲到的内容,最后把程序编译后下载到坚鸿51学习板观察结果。请直接复制第十节模板程序,修改的main程序代码如下:
 void main() //主程序
 {
 /*---C语言学习区域的开始---------------------------------------------------------------------------*/
 
 unsigned char a;
 unsigned char b;
 unsigned char c;
 unsigned char d;
 unsigned char e;
 unsigned char f;
 unsigned char g=10;  //初始化为10
 unsigned char y=0; //除数变量初始化为0。
 a=23%y;
 b=23%0;
 //b=g%0;  //这种特殊情况编译不通过:“被除数”是变量,而“除数”是常量的0。
 c=7%10;
 d=10%10;
 e=10%4;
 f=10%3;
 g%=5;  //相当于g=g%5;
 
 GuiWdData0=a;   //把a这个变量放到窗口变量0里面显示
 GuiWdData1=b;   //把b这个变量放到窗口变量1里面显示
 GuiWdData2=c;   //把c这个变量放到窗口变量2里面显示
 GuiWdData3=d;   //把d这个变量放到窗口变量3里面显示
 GuiWdData4=e;   //把e这个变量放到窗口变量4里面显示
 GuiWdData5=f;   //把f这个变量放到窗口变量5里面显示
 GuiWdData6=g;   //把g这个变量放到窗口变量5里面显示
 
 /*---C语言学习区域的结束---------------------------------------------------------------------------*/
 while(1)
 {
 initial();
 key_service();
 display_service();
 }
 
 }
 复制代码
 
 查看运算结果的方法。如何在坚鸿51学习板上观察变量?按下S1或者S5按键即可切换显示不同的窗口,从而显示不同的变量。按下S9按键不松手就可以切换到十六进制的显示界面,松开手后会自动切换到十进制的界面。上坚鸿51学习板观察程序执行的结果如下:
 变量a为23。
 变量b为1。
 变量c为7。
 变量d为0。
 变量e为2。
 变量f为1。
 变量g为0。
 下节预告:利用“整除求商求余”来提取一个数的个十百千位。转载
 
 
 |