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

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                【62.1 內存的大小端。】 C51編譯器的unsigned int占2字節RAM(也稱為內存),unsigned long占4字節RAM,這兩種數據類型所占的字節數都超過了1個字節,而RAM內存是每一個地址對應一個字節的RAM內存,那么問題就來了,比如像unsigned long這種占4個字節RAM的數據變量,它這4個字節在RAM中的地址是“連續”的“挨家挨戶”的“連號”的,這4個字節所存的一個數據,它的數據高低位在地址的排列上,到底是從低到高還是從高到低,到底是“正向”的還是“反向”?這兩種不同的排列順序,在C語言里用“大端”和“小端”這兩個專業術語來描述。“大端”的方式是將高位存放在低地址,“小端”的方式是將低位存放在低地址。比如: 假設有一個unsigned long變量a等于0x12345678,是存放在RAM內存中的4,5,6,7這四個“連號”的地址里,現在看看它在“大端”和“小端”的存儲方式里的差別。如下: (1) 在“大端”的方式里,將高位存放在低地址。 0x12存在第4個地址,0x34存在第5個地址,0x56存在第6個地址,0x78存在第7個地址。 (2) 在“小端”的方式里,將低位存放在低地址。 0x78存在第4個地址,0x56存在第5個地址,0x34存在第6個地址,0x12存在第7個地址。 問題來了,在單片機里,內存到底是“大端”方式還是“小端”方式?答:這個跟C編譯器有關。比如,在51單片機的C51編譯環境里是“大端”方式,而在STM32單片機的ARM\_MDK編譯環境里則是“小端”方式。那么問題又來了?如何知道一個C編譯器是“大端”還是“小端”?答:有兩種方式,一種是看C編譯器的說明書,另一種是自己編寫一個小程序測試一下就知道了(這種方法最簡單可靠)。那么問題又來了?講這個 “大小端”有什么用?答:這個跟指針的使用密切相關。 【62.2 化整為零。】 在數據的存儲和通信中,往往要先把數據轉換成以字節為單位的數組,才能進行數據存儲和通信。比如unsigned long這種類型的數據,就要先轉換成4個字節,這種把某個變量轉換成N個字節的過程,就是“化整為零”。“化整為零”的過程,在代碼上,有兩種常見的方式,一種是原始的“移位法”,另一種是極具優越性的“指針法”。比如,現在以“大端”方式為例(因為本教程是用C51編譯器,C51編譯器是“大端”方式),有一個unsigned long變量a等于0x12345678,要把這個變量分解成4個字節存放在一個數組Gu8BufferA中,現在跟大家分享和對比一下這兩種方法。 (1)原始的“移位法”。 unsigned long a=0x12345678; unsigned char Gu8BufferA\[4\]; Gu8BufferA\[0\]=a>>24; Gu8BufferA\[1\]=a>>16; Gu8BufferA\[2\]=a>>8; Gu8BufferA\[3\]=a; (2)極具優越性的“指針法”。 unsigned long a=0x12345678; unsigned char Gu8BufferA\[4\]; unsigned long \*pu32; //引入一個指針變量,注意,這里是unsigned long類型的指針。 pu32=(unsigned long \*)&Gu8BufferA\[0\]; //指針跟數組“綁定”(也稱為“關聯”)起來。 \*pu32=a; //這里僅僅1行代碼就等效于上述(1)“移位”例子中的4行代碼,所以極具優越性。 多說一句,“pu32=(unsigned long \*)&Gu8BufferA\[0\]”這行代碼中,其中小括號“(unsigned long \*)”是表示數據的強制類型轉換,這里表示強制轉換成unsigned long的指針方式,以后這類代碼寫多了,就會發現這種書寫方法的規律。作為語言來解讀先熟悉一下它的表達方式就可以了,暫時不用深究它的含義。 【62.3 化零為整。】 從數據存儲中提取數據出來,從通訊端接收到一堆數據,這里的“提取”和“接收”都是以字節為單位的數據,所以為了“還原”成原來的類型變量,就涉及“化零為整”的過程。在代碼上,有兩種常見的方式,一種是原始的“移位法”,另一種是極具優越性的“指針法”。比如,現在以“大端”方式為例(因為本教程是用C51編譯器,C51編譯器是“大端”方式),有一個數組Gu8BufferB存放了4個字節數據分別是:0x12,0x34,0x56,0x78。現在要把這4個字節數據“合并”成一個unsigned long類型的變量b,這個變量b等于0x12345678。現在跟大家分享和對比一下這兩種方法。 (1)原始的“移位法”。 unsigned char Gu8BufferB\[4\]={0x12,0x34,0x56,0x78}; unsigned long b; b=Gu8BufferB\[0\]; b=b<<8; b=b+Gu8BufferB\[1\]; b=b<<8; b=b+Gu8BufferB\[2\]; b=b<<8; b=b+Gu8BufferB\[3\]; (2)極具優越性的“指針法”。 unsigned char Gu8BufferB\[4\]={0x12,0x34,0x56,0x78}; unsigned long b; unsigned long \*pu32; //引入一個指針變量,注意,這里是unsigned long類型的指針。 pu32=(unsigned long \*)&Gu8BufferB\[0\]; //指針跟數組“綁定”(也稱為“關聯”)起來。 b=\*pu32; //這里僅僅1行代碼就等效于上述(1)“移位”例子中的7行代碼,所以極具優越性。 【62.4 “指針法”要注意的問題。】 “化整為零”和“化零為整”其實是一個“互逆”的過程,在使用“指針法”的時候,一定要注意“大小端”的問題。“化整為零”和“化零為整”這兩個“互逆”過程要么同時為“大端”,要么同時為“小端”,否則會因字節的排列順序問題而引起數據的嚴重錯誤。 【62.5 例程練習和分析。】 現在編一個練習程序。 /\*---C語言學習區域的開始。-----------------------------------------------\*/ unsigned long a=0x12345678; unsigned char Gu8BufferA\[4\]; unsigned char Gu8BufferB\[4\]={0x12,0x34,0x56,0x78}; unsigned long b; unsigned long \*pu32; //引入一個指針變量,注意,這里是unsigned long類型的指針。 void main() //主函數 { pu32=(unsigned long \*)&Gu8BufferA\[0\]; //指針跟數組“綁定”(也稱為“關聯”)起來。 \*pu32=a; //化整為零 pu32=(unsigned long \*)&Gu8BufferB\[0\]; //指針跟數組“綁定”(也稱為“關聯”)起來。 b=\*pu32; //化零為整 View(Gu8BufferA\[0\]); //把第1個數Gu8BufferA\[0\]發送到電腦端的串口助手軟件上觀察。 View(Gu8BufferA\[1\]); //把第2個數Gu8BufferA\[1\]發送到電腦端的串口助手軟件上觀察。 View(Gu8BufferA\[2\]); //把第3個數Gu8BufferA\[2\]發送到電腦端的串口助手軟件上觀察。 View(Gu8BufferA\[3\]); //把第4個數Gu8BufferA\[3\]發送到電腦端的串口助手軟件上觀察。 View(b); //把第5個數b發送到電腦端的串口助手軟件上觀察。 while(1) { } } /\*---C語言學習區域的結束。-----------------------------------------------\*/ 在電腦串口助手軟件上觀察到的程序執行現象如下: 開始... 第1個數 十進制:18 十六進制:12 二進制:10010 第2個數 十進制:52 十六進制:34 二進制:110100 第3個數 十進制:86 十六進制:56 二進制:1010110 第4個數 十進制:120 十六進制:78 二進制:1111000 第5個數 十進制:305419896 十六進制:12345678 二進制:10010001101000101011001111000 分析: Gu8BufferA\[0\]為0x12。 Gu8BufferA\[1\]為0x34。 Gu8BufferA\[2\]為0x56。 Gu8BufferA\[3\]為0x78。 b為0x12345678。 【62.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>

                              哎呀哎呀视频在线观看