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