C51語言變量的數(shù)據(jù)類型有哪些?
數(shù)據(jù)是程序處理的基本對象,數(shù)據(jù)類型決定了數(shù)據(jù)在存儲器中的存放方式。正確掌握數(shù)據(jù)類型是學(xué)習(xí)程序設(shè)計(jì)語言的基礎(chǔ)。
單片機(jī)C51語言兼?zhèn)涓呒壵Z言與低級語言的優(yōu)點(diǎn)。語法結(jié)構(gòu)和標(biāo)準(zhǔn)C語言基本一致,語言簡潔,便于學(xué)習(xí)。運(yùn)行于單片機(jī)平臺,支持的微處理器種類繁多,可移植性好。對于兼容的8051系列單片機(jī),只要將一個硬件型號下的程序稍加修改,甚至不加改變,就可移植到另一個不同型號的單片機(jī)中運(yùn)行。具有高級語言的特點(diǎn),盡量減少底層硬件寄存器的操作。單片機(jī)C51語言提供了完備的數(shù)據(jù)類型、運(yùn)算符及函數(shù)供使用。C51語言是一種結(jié)構(gòu)化程序設(shè)計(jì)語言,可以使用一對花括號“{}”將一系列語句組合成一個復(fù)合語句,程序結(jié)構(gòu)清晰明了。C51語言代碼執(zhí)行的效率方面十分接近匯編語言,且比匯編語言的程序易于理解,便于代碼共享。
C51語言中常用的數(shù)據(jù)類型見表8-1。下面簡要介紹表8-1中各數(shù)據(jù)類型的使用方法。
1.bit位型
bit可以定義位變量,但是不能定義位指針變量和位數(shù)組。如,“bit a;”是正確的,而
“bit*z;”和“bit z[2];”是錯誤的。
2.char字符型
signed char和unsigned char均用于字符型變量定義,前者定義有符號數(shù),后者定義無符號數(shù)。無符號數(shù)不能為負(fù)數(shù),若將負(fù)數(shù)賦值給無符號數(shù),則該負(fù)數(shù)將被轉(zhuǎn)換成其補(bǔ)碼所對應(yīng)的無符號數(shù)。如,指令“unsigned char x=-1;”使x的實(shí)際值為255(255是-1的8位補(bǔ)碼)。
3.int整型
signed short int和unsigned short int均用于整型變量定義,前者定義有符號數(shù),后者定義無符號數(shù)。另外,signed short int和unsigned short int可分別簡寫為signed int和unsigned int。
4.long長整型
signed long int和unsigned long int均用于長整型變量定義,前者定義有符號數(shù),后者定義無符號數(shù)。
5.浮點(diǎn)型
float和double型變量都是浮點(diǎn)型變量,這兩種變量類型完全等價,其取值范圍和位數(shù)等完全相同。這與PC的C語言不同,在PC的C語言中,float型變量和double型變量的取值范圍和位數(shù)等均不同。
6.指針型
*可以加在字符型、整型、長整型和浮點(diǎn)型變量定義之前,從而形成相應(yīng)類型的指針型變量。如,指令“char*x;”定義char型的指針變量x。指針型變量中存放存儲器或特殊功能寄存器的地址,通過該地址可以訪問存儲器或特殊功能寄存器中存放的數(shù)據(jù)。
7.可尋址位
sbit用于定義單片機(jī)特殊功能寄存器中可尋址的位。例如,指令“sbit f=P2^1;”定義的變量f被初始化為特殊功能寄存器P2的第1位。嚴(yán)格來說,sbit并不是變量定義,而只是給特殊功能寄存器的可尋址位賦予一個別名而已。
需要注意的是,因?yàn)閟bit定義的變量來自于特殊功能寄存器,所以sbit型變量的位地址必須在0x80~0xFF范圍內(nèi),即特殊功能寄存器區(qū)的位地址范圍。例如,指令“sbit A_0=0xe0;”為累加器A的最低位定義了位變量A_0,指令“A_0=1;”將累加器A的最低位設(shè)置為1;而指令“sbit somebit=0x7f;”是錯誤的,因?yàn)?x7f作為一個位地址不在特殊功能寄存器區(qū)的位地址范圍內(nèi)。
另外,補(bǔ)充說明:在C51語言中,十六進(jìn)制需以“0X”或“0x”開頭,且數(shù)字末尾不加字母“H”或“h”。
8.特殊功能寄存器
Sfr可定義特殊功能寄存器變量。嚴(yán)格來說,sfr并未定義變量,而僅是給單片機(jī)的特殊功能寄存器賦予一個別名。例如,指令“sfr W=0x80;”將特殊功能寄存器P0的地址賦予變量W,之后,變量W與P0等價。需要注意的是,sfr定義中出現(xiàn)的地址只能是特殊功能寄存器的地址。
9.16位特殊功能寄存器
sfr16用于定義16位特殊功能寄存器變量。例如,指令“sfr16 Time=0x8C;”定義了16位的特殊功能寄存器變量Time,該變量由字節(jié)地址為0x8C和0x8C+1的兩個8位特殊功能寄存器拼接而成,其中,字節(jié)地址為0x8C的TH0為Time的低8位,字節(jié)地址為0x8D的TH1為Time的高8位。
這里需要特別說明的是,為了方便用戶使用特殊功能寄存器,Keil C51編譯器預(yù)定義了一些sbit、sfr和sfr16變量,如:P0是預(yù)定義的sfr型變量,并且已經(jīng)在頭文件“reg51.h”中進(jìn)行了定義,若需在程序中使用這些預(yù)定義的變量,僅需在程序中加入“#include”即可。