<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                【23.1 **減法溢出與假想借位**。】 英文“unsigned”的中文意思就是”無符號的”,延伸含義是“無負號無負數”的意思,所以unsigned char ,unsigned int ,unsigned long這三種類型數據都是無負號無負數的,取值只能是0和正數,那么問題來了,當被減數小于減數的時候,運算結果會是什么樣子,有什么規律?這就是本節要研究的減法溢出。 第一個例子: unsigned char a; a=0-1; 分析: 左邊的“保存變量”a的數據長度是1個字節8位,a=0-1可以看成是十六進制的a=0x00-0x01。由于0x00比0x01小,所以假想一下需要向高位借位,借位后成了a=0x100-0x01。所以a的最終結果是0xff(十進制是255),這個“假想一下需要向高位借位”的過程就是本節制造的新概念“假想借位”。根據“假想借位”這個規律,如果是b也是unsigned char 類型,那么b=2-5自然就相當于b=0x102-0x05,運算結果b等于0xfd(十進制是253)。 第二個例子: unsigned int c; c=0-1; 分析: 左邊的“保存變量”c的數據長度是2個字節16位,c=0-1可以看成是十六進制的c=0x0000-0x0001。由于0x0000比0x0001小,所以假想一下需要向高位借位,借位后成了c=0x10000-0x0001。所以c的最終結果是0xffff(十進制是65535)。根據“假想借位”這個規律,如果是d也是unsigned int 類型,那么d=2-5自然就相當于d=0x10002-0x0005,運算結果d等于0xfffd(十進制是65533)。 綜合分析: 為什么上述例子中會出現數據越減越大的奇葩現象?是因為減法溢出,是因為“假想借位”中的“借”是“光借不還”。一句話,根本問題就是溢出問題。 【23.2 因為**減法溢出,所以加減順序......**】 第三個例子:請分析下面例子中e和f因加減運算順序不同而引發什么問題。 unsigned char e; unsigned char f; e=1-6+7; f=1+7-6; 用兩種思路分析: 第一種思路:只看過程不看結果。加減法的運算優先級是從左到右,e先減法后加法,1減去6就有溢出了,所以過程有問題。而f先加法后減法,整個過程沒有問題。 第二種思路:先看結果再分析過程。e的運算結果居然是2,f的運算結果也是2。好奇怪,既然e的過程有問題,為什么運算結果卻沒有問題?其實e發生兩次溢出,第一次是減法溢出,第二次是加法溢出,所以“溢溢得正”(這句話是開玩笑的)。1-6“假想借位”后相當于0x101-0x06,運算結果等于0xfb(十進制是251),然后0xfb再加上0x07等于0x102,因為e是unsigned char 類型只有1個字節,根據加法溢出的規律,最后只保留了低8位的一個字節0x02,所以運算結果就是十進制的2。 結論: 雖然e的運算結果僥幸是對的,但是其運算過程發生了溢出是有問題的,當運算式子更復雜一些,比如有不同類型的變量時,就有可能導致運算結果也出錯。所以得出的結論是:在加減法運中,為了減少出現減法溢出的現象,建議先加法后減法。在后續章節講到的乘除法運算中,為了減小運算帶來的誤差也建議大家先乘法后除法。 【23.3 例程練習和分析。】 現在我們編寫一個程序來驗證上面講到的例子: 程序代碼如下: /\*---C語言學習區域的開始。-----------------------------------------------\*/ void main() //主函數 { unsigned char a; //定義一個變量a,并且分配了1個字節的RAM空間。 unsigned char b; //定義一個變量b,并且分配了1個字節的RAM空間。 unsigned int c; //定義一個變量c,并且分配了2個字節的RAM空間。 unsigned int d; //定義一個變量d,并且分配了2個字節的RAM空間。 unsigned char e; //定義一個變量e,并且分配了1個字節的RAM空間。 unsigned char f; //定義一個變量f,并且分配了1個字節的RAM空間。 //第一個例子,針對a與b都是unsigned char類型數據。 a=0-1; b=2-5; //第二個例子,針對c與d都是unsigned int類型的數據。 c=0-1; d=2-5; //第三個例子,e與f的加減順序不一樣。 e=1-6+7; f=1+7-6; View(a); //把第1個數a發送到電腦端的串口助手軟件上觀察。 View(b); //把第2個數b發送到電腦端的串口助手軟件上觀察。 View(c); //把第3個數c發送到電腦端的串口助手軟件上觀察。 View(d); //把第4個數d發送到電腦端的串口助手軟件上觀察。 View(e); //把第5個數e發送到電腦端的串口助手軟件上觀察。 View(f); //把第6個數f發送到電腦端的串口助手軟件上觀察。 while(1) { } } /\*---C語言學習區域的結束。-----------------------------------------------\*/ 在電腦串口助手軟件上觀察到的程序執行現象如下: 開始... 第1個數 十進制:255 十六進制:FF 二進制:11111111 第2個數 十進制:253 十六進制:FD 二進制:11111101 第3個數 十進制:65535 十六進制:FFFF 二進制:1111111111111111 第4個數 十進制:65533 十六進制:FFFD 二進制:1111111111111101 第5個數 十進制:2 十六進制:2 二進制:10 第6個數 十進制:2 十六進制:2 二進制:10 分析: 通過實驗結果,發現在單片機上的計算結果和我們的分析是一致的。 【23.4 如何在單片機上練習本章節C語言程序?】 直接復制前面章節中第十一節的模板程序,練習代碼時只需要更改“C語言學習區域”的代碼就可以了,其它部分的代碼不要動。編譯后,把程序下載進帶串口的51學習板,通過電腦端的串口助手軟件就可以觀察到不同的變量數值,詳細方法請看第十一節內容。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看