<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > 51單片機之C語言-4.1數(shù)據(jù)類型

          51單片機之C語言-4.1數(shù)據(jù)類型

          作者: 時間:2016-11-21 來源:網(wǎng)絡 收藏
          從這一章起我們開始學習單片機C語言,既然是語言那么就應該有基本詞匯和相關的語法。我們先來看看數(shù)據(jù)類型。講數(shù)據(jù)之前先簡單說說單片機的存儲結構。我們知道單片機要運行之前,我們需要給他寫指令,指令存放在ROM存儲器上。我們再細想一下,既然存放在ROM上,那么我們來想一個問題,比如我的指令中有個數(shù)字‘3’要,這個‘3’是怎么存放的?相信這個很容易,單片機中存放的都是二進制,那么首先要轉(zhuǎn)成二進制11B,格式如下:

          這個不就是表示3了嗎?也就是說,如果你要放這個數(shù),我把這個數(shù)先轉(zhuǎn)成二進制形式(可以直接使用電腦自帶的計算機來轉(zhuǎn)換),然后找單片機的存儲器要2個格子放進去1或者0就行了。這樣理解對不對呢?不對。你向單片機要格子的時候,單片機要么給你8個格子,要么16個,也就是8整數(shù)倍。為什么是這樣?因為單片機存儲器的最小單元是一個字節(jié)(8位).也就是說,即便你只想放一個數(shù)字1,單片機也會給你8個格子。這里我們可以這樣來理解存儲器:

          本文引用地址:http://www.ex-cimer.com/article/201611/319550.htm

          每一行8個單元格,每個單元格能放0或者1.ROM由很多個這樣的單元格組成。具體的我們后面再講。于是這樣我們存放3,30,40,120等等就容易了,都是放在同一行的單元格中。這樣每一行能存放的大小范圍為0-255.也就是說在0-255直接任意大小的數(shù)據(jù)都很好存儲了。像這樣的數(shù)據(jù)我們就叫char型。但是又有了個問題,如果我要存放-3這個負數(shù),怎么辦?我們說過這些單元格只能放1或者0,不能放負號進去,怎么辦?于是我們想了個辦法,就從8個單元格中取一個出來,用0表示正,1表示負。取哪一個單元格,最高位也就是最左邊的那個為最高位。假如我現(xiàn)在在最高位放一個1,那么單片機怎么知道這個最高位是1還是表示負數(shù),比如:

          1111_0110這個是多少,246還是-118,怎么區(qū)別?看看我們是怎么告訴單片機的,

          unsignedchar 表示最高位為數(shù)字,signed char表示最高位為正負。

          好了,問題來了。如何我現(xiàn)在要存放256怎么辦?8個單元格肯定不夠用了,需要9個單元格,前面說了,要么8個單元格,要么16個單元格,單片機不給你9個單元格,這樣我們只好用16個單元格,即使只用了9個單元格,有點浪費. 這16個格子就表示int整型。同樣的,正負也是占用最高位的一個格子,unsigned int 表示最高位的單元格是數(shù)字,signed int最高單元格表示正負。舉個例子:65367

          如果是unsigned int,則表示65367

          如果是signed int,表示-32599

          很容易的可以算出,unsigned int的范圍:0-65535

          signedint的范圍: -32768 – 32767

          現(xiàn)在我們知道了8個單元格就是char,16單元格就是int(范圍限于本單片機).那么有沒有24個單元格呢?沒有,只有32個格子,這個是固定的。32格子就是長整型了,用long表示。同樣的,可以知道,

          unsignedlong 范圍:0 – 4294967295,

          signedlong 范圍:-2147483648 – 2147483647

          通過以上的分析,我們可以知道,如果要使用的數(shù)據(jù)只需要占用8個格子,就沒有必要占用16個格子,這樣可以節(jié)省存儲空間。

          另外這里補充兩個程序中經(jīng)常用到的兩個指令 define和typedef

          1. 無參宏定義

          #define 標志符 字符串

          其中的"#"表示這是一條預處理命令。凡是以"#"開頭的均為預處理命令。"標志符"為所定義的宏名。"字符串"可以是常數(shù),表達式,格式串等。

          例如:

          #define M (y*y+3*y)

          它的作用是指定標志符M來代替表達式(y*y+3*y). 在編寫源程序時,所有的(y*y+3*y)都可由M代替。

          注意#define M(y*y+3*y)后面不可以有分號";",否則M將分號一起替換

          2. 類型定義符typedef

          C語言不僅提供了豐富的數(shù)據(jù)類型,而且還允許由用戶自己定義類型說明符,也就是說允許由用戶為數(shù)據(jù)類型取"別名"。類型定義符typedef即可用來完成此功能。typedef定義的一般形式為:typedef 原類型名 新類型名例如 typedef char NAME[20];表示Name是字符數(shù)組類型,數(shù)組長度為20,注意后面帶有分號。然后可以用NAME說明變量,如:NAME a1, a2, s1,s2;完全等效于:char a1[20], a2[20],s1[20],s2[20]宏定義define與類型說明符typedef的區(qū)別在單片機編程中我們經(jīng)??吹?#define uchar unsigned char#define uint unsigned int也可以使用typedef來定義:typtedef unsigned char uchar;typedef unsigned int uint;但是碰到如下情況就不能互換了,#define PIN1 int *typedef (int *) PIN2;從形式上看這兩者相似,但在實際使用中卻不相同。下面用PIN1,PIN2說明變量時就可以看出它們的區(qū)別:PIN1 a, b;在宏代換后變成:int *a,b;表示a是指向整形的指針變量,而b是整型變量。然而:PIN2 a,b;表示a,b都是指向整型的指針變量。因為PIN2是一個類型說明符。由這個例子可見,宏定義雖然也可表示數(shù)據(jù)類型,但畢竟是作為字符代換。在使用時要非常小心,以避免出錯。以上我們概述了數(shù)據(jù)類型,現(xiàn)在我們各舉一個例子說明,例1 比較unsigned char; unsigned int; unsigned long 占用存儲空間的大小運行程序之前需要設置keil優(yōu)化等級,將優(yōu)化等級設置為0過程如下:在keil界面-> project->Options for target target 1...點擊C51,選擇Level為0

          代碼如下:

          #include "reg52.h"

          sbit LED0=P1^3;

          void main(void)

          {

          unsigned char i;

          i=0x30;

          LED0=i;

          while(1);

          }

          //輸出結果信息 Program Size: data=10.0 xdata=0 code=27

          #include "reg52.h"

          sbit LED0=P1^3;

          void main(void)

          {

          unsigned int i;

          i=0x30;

          LED0=i;

          while(1);

          }

          //Program Size: data=11.0 xdata=0 code=32

          #include "reg52.h"

          sbit LED0=P1^3;

          void main(void)

          {

          unsigned long i;

          i=0x30;

          LED0=i;

          while(1);

          }

          //Program Size: data=13.0 xdata=0 code=46

          //unsigned char: Program Size: data=10.0 xdata=0 code=27//unsigned int: Program Size: data=11.0 xdata=0 code=32//unsigned long:Program Size: data=13.0 xdata=0 code=46可見同樣一個數(shù)據(jù)0x30, 使用不同的數(shù)據(jù)類型定義,將占據(jù)不同的存儲空間例2 define的使用

          #include "reg52.h"

          #define uchar unsigned char //注意后面沒有分號

          sbit LED0=P1^3;

          void main(void)

          {

          uchar i;

          i=0x30;

          LED0=i;

          while(1);

          }

          例3 typedef的使用

          #include "reg52.h"

          typedef unsigned char uchar;//注意后面有分號

          sbit LED0=P1^3;

          void main(void)

          {

          uchar i;

          i=0x30;

          LED0=i;

          while(1);

          }



          評論


          技術專區(qū)

          關閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();