新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 第28節:整除求余的運算

        第28節:整除求余的運算

        作者: 時間:2016-11-22 來源:網絡 收藏
        從業十年,教你單片機入門 第28講:

        求余跟上一節講的求商都是屬于整除運算,區別是:求余返回余數,求商返回商。整除求余的余數有一個很明顯的規律:余數永遠小于除數(除數不為0的情況下)。比如,除數是10,那么不管被除數有多大,余數必然是從0到9的數,不可能是10以上的數。上一節提到除法求商的運算符號是“/”,而除法求余的運算符號是“%”,外形跟百分號一致,只是在C語言中用來做除法求余的運算符而已。

        本文引用地址:http://www.104case.com/article/201611/319837.htm

        整除求余的通用格式:

        “保存變量”=“被除數”% “除數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。

        下節預告:利用“整除求商求余”來提取一個數的個十百千位。



        評論


        技術專區

        關閉
        主站蜘蛛池模板: 龙里县| 牙克石市| 台山市| 陈巴尔虎旗| 碌曲县| 泾阳县| 揭西县| 合作市| 长子县| 铜陵市| 天峨县| 贵港市| 梅州市| 衡阳县| 武清区| 唐山市| 民和| 峨山| 曲松县| 西乌珠穆沁旗| 东乡族自治县| 天津市| 宝鸡市| 安阳县| 舞阳县| 宜兰市| 麟游县| 五大连池市| 游戏| 汨罗市| 密云县| 寿光市| 留坝县| 嘉定区| 浏阳市| 昭苏县| 杭锦后旗| 清流县| 衡阳县| 武陟县| 炉霍县|