第28节:整除求余的运算

发布者:独享留白1028最新更新时间:2016-03-10 来源: eefocus关键字:整除求余  运算  单片机 手机看文章 扫描二维码
随时随地手机看文章
从业十年,教你单片机入门 第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。

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

关键字:整除求余  运算  单片机 引用地址:第28节:整除求余的运算

上一篇:如何写出高效优美的单片机C语言代码?
下一篇:第27节:整除求商的运算

推荐阅读最新更新时间:2024-03-16 14:46

单片机成长之路(avr基础篇)- 003 AVR单片机的BOOT区
BOOT区的由来基于一个简单的道理,即单片机的程序是保存在FLASH中的,要运行程序就必须不停的访问FLASH存储器。对于一般的FLASH存储器,数据的写入需要一定的时间来完成,在数据写入完成之前,存储器中所有的数据都是不可读的,这就在运行旧程序和写入新程序之间造成了一个矛盾。 使用BOOT区是解决这个矛盾的方法之一,它将FLASH存储器从物理上分为两个独立的区域,对其中的一个区的数据写入不会影响到另一个区的数据读取操作。我们可以让单片机的程序在其中一个区(通常是BOOT区)运行,而运行着的程序代码写入另外一个区(通常为应用程序区)内。 AVR高档单片机ATmega系列中含有BOOT代码区,即程序引导区,也可称器件自身监控
[单片机]
C51单片机学习手记之1:一盏闪烁
最近开始学习C51单片机,可谓磕磕绊绊,因为本人比较笨笨啦...(听听Michael Jackson的《Heal The World》就坚持下来了),不知道对大家是否有用... 闲言碎语不要讲,下面我就来说说这迈出的第一步,我从2010年才接触到单片机,想想比别人晚了10多年,不过没关系,只要有心学习,从0-1很难,但从1到100、1000、...可能就没有那么麻烦了。主要要自学单片机原理、电子线路、汇编语言,C语言,如果你刚好学过,那就恭喜啦。 本文旨在介绍单片机入门的基础知识,为和我一样的新手提供一个交流的平台。仿真所使用单片机为 ATMEL公司的AT89C52,软件为PROTEUS和KEIL;只提供原理图和KEIL环境
[单片机]
C51<font color='red'>单片机</font>学习手记之1:一盏闪烁
Atmel 90系列AVR单片机烧录器
AVRPRO烧录器,是针对ATMEL公司的90系列AVR精简指令单片机设计的专用烧录工具该产品只有软件部分,无需硬件支持,仅仅只需4根线,将计算机并口和用户板相连,这都是因为采用了ISP串行编程。软件支持擦、写、校验、写保护位以及批处理。使用极其方便。 该产品的最大优点有: 1.使用串行编程,达到了在线编程,节省了购买万用编程器和适配器的费用(万用编程器需2千元左右,适配器需3、4百元,并各个芯片和封装需不同适配器)。用户板也无需在焊插座(带来可靠性下降),而且为软件升级带来了极大的便利。 2.使用方便,无需硬件,给现场调试带来了极大的便利,不用再带笨重的编程器,而且为AVR单片机的使用上带来了方便。 3.价格实在太便
[单片机]
基于单片机的LED轮廓显示控制器设计方案
  LED护栏管又名丽得管,是一种先进的LED装饰照明灯饰产品。以红、绿、蓝3种颜色的LED作为光源,使用了微电子和数码技术,能进行色彩追逐,色彩过渡渐变,灰度变化和七色变化,能产生十分丰富的色彩变幻效果。该产品外形采用一次成型,灯管和底座浑为一体,防水性更好,重量更轻。广泛适用于酒吧、舞厅、大厦、广场、桥梁、栏杆等各种大型建筑装饰,全彩管更可以在一个大范围的区域实现灯光群控和显示动态节目,适合大型主题夜景。   文中提出了一种主从式单片机的LED轮廓显示屏解决方案,该设计方案利用STC单片机自身的FLASH ROM和RAM,外部无需任何存储电路,电路结构简单。可实现交流同步显示,驱动当前LED亮化市场中的多款LED护栏管与点
[电源管理]
基于<font color='red'>单片机</font>的LED轮廓显示控制器设计方案
瑞萨电子宣布将全面支持面向未来汽车级MCU和SoC的ISO/SAE 21434标准
网络安全管理系统更新确保贯穿产品生命周期的整体网络安全 全球半导体解决方案供应商瑞萨电子集团(TSE:6723)今日宣布,自2022年1月起的新开发项目中,瑞萨的汽车级微控制器(MCU)和片上系统(SoC)解决方案将完全满足ISO/SAE 21434道路车辆网络安全工程国际标准。瑞萨此举秉承公司对汽车网络安全的持续性承诺,旨在建立并实施强大的网络安全管理系统(CSMS),并使其成为联合国欧洲经济委员会(UNECE)新法规 UN R155 的组成部分。 这一承诺还向OEM(original equipment manufacturers,原始设备制造商)和一级供应商重申瑞萨将继续履行其CSMS责任。自2022年1月开始,瑞萨
[汽车电子]
瑞萨电子宣布将全面支持面向未来汽车级<font color='red'>MCU</font>和SoC的ISO/SAE 21434标准
基于AVR单片机的挖掘机器人控制系统设计
引言 挖掘机的出现使人类从繁重的体力劳动中解脱出来,然而传统的挖掘机操作复杂,对操作者的技能要求很高。人们一直谋求更省力、更高效率和更能实现精确轨迹的挖掘作业模式。随着微电子技术的进一步发展,集成电路的集成度和性能提高、价格下降,以微处理器为基础,实现挖掘机的机电一体化、机器人化、智能化进程,已经成为工程项目施工管理的一个重要研究课题与发展方向。本文以挖掘机器人为例,设计一种基于AVR单片机的挖掘机器人控制系统。 1 总体方案设计 挖掘机器人由挖掘机器人本体机械系统、红外传感器组成的传感器系统、直流电机驱动系统、以AVR单片机为核心的控制系统等四部分组成,其基本结构如图1所示。 图1 挖掘机器人的基本结构
[单片机]
基于AVR<font color='red'>单片机</font>的挖掘机器人控制系统设计
基于PIC16F628A的入侵探测装置
简介:介绍一种来人探测装置的原理及特点。该装置基于PIC16F628A单片机,采用一对收发独立的超声波换能器,利用多普勒效应,在一定空间内能够有效地探测到是否有人进入,并且能够输出信号控制照明设备的开关。 使用超声波可以很方便的对一定空间内的运动物体进行有效的探测,具有安装方便,探测效果好的特点。本文介绍一种利用超声波多普勒效应设计的来人探测装置。该设计使用了PIC16F628A单片机,对以往用到的超声波探测硬件电路进行改进,利用软件编程对来人情况进行有效地探测,继而输出控制信号控制照明装置的开关。 1 工作原理及特点 当声源与声波接收器之间存在有相对运动时,声波接收器所接收到的信号频率将与传播的声波频率有所不同,频率
[单片机]
基于PIC16F628A的入侵探测装置
单片机存储器一些相关知识的学习
接着上一期内容我们继续来认识一下单片机存储器,学习一些相关知识。 片内的ROM和片外的ROM有两种组合方案,第一个方案是51单片机内部的ROM一共有4K,4K是它的存储容量,它的存储空间分布地址分布式从0000H到0FFFH,大家要理解什么叫做存储容量,什么叫做地址分布,比如说一个空间里面可以容纳4085个人,这4085个人指这个空间的容量是4085个人,把十进制的4085转换成这个二进制转换成二进制的这种方式称之为4K,也就是按照二进制进行编码,一共会占到12个1,就是2的平方乘以2的10次方,这样的话它的地址空间就是从0000H到0FFFH,也就相当于是这个空间一共是4096个座位,每个座位上可以做一个8位的二进制数,这个座位
[单片机]
<font color='red'>单片机</font>存储器一些相关知识的学习
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved