当前位置:首页 > 单片机 > 单片机
[导读]从业十年,教你单片机入门 第28讲:求余跟上一节讲的求商都是属于整除运算,区别是:求余返回余数,求商返回商。整除求余的余数有一个很明显的规律:余数永远小于除数(除数不为0的情况下)。比如,除数是10,那么不管

从业十年,教你单片机入门 第28讲:

求余跟上一节讲的求商都是属于整除运算,区别是:求余返回余数,求商返回商。整除求余的余数有一个很明显的规律:余数永远小于除数(除数不为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。

下节预告:利用“整除求商求余”来提取一个数的个十百千位。

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

【2024年3月7日,德国慕尼黑讯】在竞争激烈的全球半导体市场,制造商一直在努力缩短产品上市时间。同时,他们对流畅、高分辨率图形显示器的需求也在日益增长。为了满足这些市场需求,英飞凌科技股份公司(FSE代码:IFX /...

关键字: MCU GUI 图形显示器

在编程和计算中,运算符优先级是解释和计算表达式的一个关键因素。本文旨在阐述运算符优先级的概念、规则及其在表达式中的应用,以帮助读者更好地理解和运用运算符优先级。

关键字: 表达式 运算符 编程

本文利用Matlab GUI设计通过串口进行数据发送和接收的界面,并利用内置于Matlab的串口通信API实现串口数据发送与接收功能。

关键字: matlab GUI 串口通信

C语言是一种计算机程序设计语言,它既具有高级语言的特点,又具有汇编语言的特点。它由美国贝尔研究所的D.M.Ritchie于1972年推出,1978年后,C语言已先后被移植到大、中、小及微型机上,它可以作为工作系统设计语言...

关键字: C51语言 运算符

一星期中最糟糕的一天,这居然也成功拿下了吉尼斯记录。10月17日,吉尼斯世界纪录官微发文称,正式认证星期一为一个周里最糟糕的一天,周五是最伟大的一天。看起来有点官微小编搞怪的意思,毕竟尚未见到正式的证书。当然,一些打工人...

关键字: MIDDOT MDASH GUI WORLD

(全球TMT2022年5月26日讯)disguise  -- 视觉叙事平台和扩展现实(xR)解决方案市场领导者 -- 宣布推出元宇宙解决方案部门,帮助元宇宙实现下一代非凡的现场、虚拟制作和基于位置的视听体验。...

关键字: GUI SE AN BSP

伦敦2022年5月26日  /美通社/ -- disguise  -- 视觉叙事平台和扩展现实(xR)解决方案市场领导者 -- 宣布推出元宇宙解决方案部门,帮助元宇宙实现下一代非凡的现场、虚拟制作和基...

关键字: GUI SE RS NI

西班牙巴塞罗那2022年3月1日 /美通社/ -- 在MWC22 巴塞罗那期间,华为运营商BG Marketing与解决方案销售部总裁彭松发表了题为“拥抱数字世界,GUIDE引领未来”的主题演讲,分享了对于未来...

关键字: GUI IDE 华为

今天,我们来聊一道常见的考题,也出现在腾讯面试的三面环节,非常有意思。具体的题目如下:文件中有40亿个QQ号码,请设计算法对QQ号码去重,相同的QQ号码仅保留一个,内存限制1G.这个题目的意思应该很清楚了,比较直白。为了...

关键字: 腾讯 BITMAP UNSIGNED 内存

今天,我们来聊一道常见的考题,也出现在腾讯面试的三面环节,非常有意思。具体的题目如下:文件中有40亿个QQ号码,请设计算法对QQ号码去重,相同的QQ号码仅保留一个,内存限制1G. 这个题目的意思应该很清楚了,比较直白。为...

关键字: BITMAP UNSIGNED 内存 腾讯
关闭
关闭