<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>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                【38.1 意外溢出。】 運算過程中的意外溢出,稍不注意,就中招,不信,請看下面的例子: /\*---C語言學習區域的開始。-----------------------------------------------\*/ unsigned long a=0; unsigned int x=1000; unsigned int y=3000; void main() //主函數 { a=x\*y; //猜猜a是多大? View(a); //把第1個數a發送到電腦端的串口助手軟件上觀察。 while(1) { } } /\*---C語言學習區域的結束。-----------------------------------------------\*/ 猜猜a是多大?很多人以為理所當然3000000,但是實際上是50880!中招了吧。莫名其妙的50880,就是因為意外溢出所致。怎么辦呢?請看下面介紹的兩種解決辦法。 【38.2 第一種辦法:引入中間變量。】 我在前面章節中曾多次說過“為了避免運算過程中的意外溢出,建議大家把所有參與運算的變量都用unsigned long類型的變量,如果不是unsigned long類型的變量,就引入unsigned long類型的中間變量。”這種老方法如下: /\*---C語言學習區域的開始。-----------------------------------------------\*/ unsigned long a=0; unsigned int x=1000; unsigned int y=3000; unsigned long s; //引入的unsigned long中間變量。 unsigned long t; //引入的unsigned long中間變量。 void main() //主函數 { s=x; //先把變量的數值搬到unsigned long中間變量。 t=y; //先把變量的數值搬到unsigned long中間變量。 a=s\*t; //中間變量代表原始變量進行運算。 View(a); //把第1個數a發送到電腦端的串口助手軟件上觀察。 while(1) { } } /\*---C語言學習區域的結束。-----------------------------------------------\*/ 這一次,運算結果是正確的3000000。 現在反省了一下,這種辦法雖然可靠實用,但是顯得有點羅嗦,而且引入的中間變量也無形中增加了一點內存。還有沒有更好的辦法?請看下面介紹的第二種辦法。 【38.3 第二種辦法:C語言的類型強制轉換。】 前面章節提到,括號在C語言中有強制的意思,可以強制改變優先級,在本節也可以臨時強制改變運算過程中的變量類型。在運算過程中臨時強制改變類型變量,就可以省去額外引入的中間變量,這種方法相比上面第一種老辦法確實更便捷靈活。 /\*---C語言學習區域的開始。-----------------------------------------------\*/ unsigned long a=0; unsigned int x=1000; unsigned int y=3000; void main() //主函數 { a=(unsigned long)x\*(unsigned long)y; //添加的兩個括號就是類型的強制轉換。 View(a); //把第1個數a發送到電腦端的串口助手軟件上觀察。 while(1) { } } /\*---C語言學習區域的結束。-----------------------------------------------\*/ 這一次,運算結果也是正確的3000000。 多說一句,除了上述的乘法運算之外,其它的加、減、除法運算適不適用呢?雖然我還沒有逐個測試,但是我感覺應該是都適用的。因此,在“加、減、除”等運算中,在必要的時候,也要在相關的變量的前綴加上類型的強制轉換。 【38.4 全局變量和局部變量。】 先插入一個知識點,細心的朋友會發現,我上面的例子中,定義的變量都放在了main函數之外的上面,這種把變量定義在函數外面的變量叫全局變量,以前例子中定義在函數內的變量叫局部變量。 unsigned char a; //這個在函數之外,叫全局變量 void main() //主函數 { unsigned char b; //這個在函數之內,叫局部變量 while(1) { } } 上面例子中,a定義在函數之外是全局變量,b定義在函數之內是局部變量。全局變量與局部變量有什么不一樣呢?以后的章節會仔細講解這方面的知識,現在暫時不講。之所以在這里提出這個知識點,是因為我今后的例子很多變量可能都會定義成全局變量,因此先在這里給大家打個招呼,知道C語言有這樣一種語法就可以。 【38.5 例程練習和分析。】 現在編寫一個程序來驗證剛才講到的主要內容: 程序代碼如下: /\*---C語言學習區域的開始。-----------------------------------------------\*/ unsigned long a=0; unsigned long b=0; unsigned long c=0; unsigned int x=1000; unsigned int y=3000; unsigned long s; //中間變量 unsigned long t; void main() //主函數 { a=x\*y; //意外溢出 s=x; //引入中間變量 t=y; b=s\*t; c=(unsigned long)x\*(unsigned long)y; //類型的強制轉換 View(a); //把第1個數a發送到電腦端的串口助手軟件上觀察。 View(b); //把第2個數a發送到電腦端的串口助手軟件上觀察。 View(c); //把第3個數a發送到電腦端的串口助手軟件上觀察。 while(1) { } } /\*---C語言學習區域的結束。-----------------------------------------------\*/ 在電腦串口助手軟件上觀察到的程序執行現象如下: 開始... 第1個數 十進制:50880 十六進制:C6C0 二進制:1100011011000000 第2個數 十進制:3000000 十六進制:2DC6C0 二進制:1011011100011011000000 第3個數 十進制:3000000 十六進制:2DC6C0 二進制:1011011100011011000000 分析: 通過實驗結果,發現在單片機上的實驗結果和我們的分析是一致的。 【38.6 如何在單片機上練習本章節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>

                              哎呀哎呀视频在线观看