- 零基礎(chǔ)學(xué)單片機(jī)C語言程序設(shè)計
- 趙建領(lǐng) 薛園園等編著
- 2992字
- 2018-12-31 21:41:34
3.4 C51的變量類型
數(shù)據(jù)類型是C51語言最基本的組成部分。在C51中,每個變量在使用之前必須定義其數(shù)據(jù)類型。C51語言中的數(shù)據(jù)類型分為基本數(shù)據(jù)類型和聚合數(shù)據(jù)類型,這里首先介紹基本數(shù)據(jù)類型。
3.4.1 C51的數(shù)據(jù)類型
C51的基本數(shù)據(jù)類型有整型(int)、浮點(diǎn)型(float)、字符型(char)、無值型(void)。在基本數(shù)據(jù)類型中,除void類型外,其前面均可以有各種修飾符。修飾符用來改變基本類型的意義,以便更準(zhǔn)確地適應(yīng)各種情況的需求。
常用的修飾符有signed(有符號)、unsigned(無符號)、long(長型符)、short(短型符)。在C51語言中,所有數(shù)據(jù)類型的字長和取值范圍如表3.2所示。
表3.2 C51語言的數(shù)據(jù)類型

注意
表中各個數(shù)據(jù)類型組合的字長和取值范圍是假定CPU的字長為16bit。
從表中可以看出,修飾符signed、short、long和unsigned可以修飾字符型和整型兩種基本類型。此外,修飾符long還可用于float型。
說明
C51除了繼承了標(biāo)準(zhǔn)C語言中基本的數(shù)據(jù)類型外,又兼具其本身的特點(diǎn),如在C51語言中int和short,float和double具有相同的取值范圍和含義。
一般來說,編譯環(huán)境對整數(shù)類型的默認(rèn)定義是有符號數(shù),singed修飾符可以省略。為了使用方便,C51編譯程序允許使用整型簡寫形式,如下所示。
?short int簡寫為short
?long int簡寫為long
?unsigned short int簡寫為unsigned short
?unsigned int簡寫為unsigned
?unsigned long int簡寫為unsigned long
另外,某些編譯環(huán)境允許將unsigned用于浮點(diǎn)型,如unsigned float。但這種數(shù)據(jù)類型并不通用,在程序移植時會出現(xiàn)問題,建議一般不要采用。
此外,C51語言還提供了幾種聚合類型(aggregate types),包括數(shù)組、指針、結(jié)構(gòu)、聯(lián)合(共用體)、枚舉和位域。這幾種聚合類型將在后面章節(jié)中陸續(xù)介紹,這里首先介紹常用的基本類型。
3.4.2 整型變量
整型變量是整數(shù)類型的數(shù)據(jù)。整型變量是最常用的數(shù)據(jù)類型。整型變量的定義格式是“類型說明符變量標(biāo)識符,變量標(biāo)識符...”。示例如下。
int a, b; //定義a、b為短整型變量 long c, d; //定義c、d為長整型變量
其中,類型說明符與變量標(biāo)識符之間至少有一個空格。最后一個變量標(biāo)識符必須以“;”結(jié)尾。整型變量的前面可以加上不同的修飾符,整型變量的類型如表3.3所示。
表3.3 整型變量的類型

說明
在有符號型數(shù)據(jù)的二進(jìn)制表示中,字節(jié)最高位表示數(shù)據(jù)的符號,“0”表示正數(shù),“1”表示負(fù)數(shù)。
另外,在C51中定義變量時,允許同時定義多個相同類型的變量,各變量間用逗號間隔。變量定義必須放在變量使用之前,一般位于函數(shù)的開頭。整型變量使用的示例程序如下。
#include <stdio.h> //頭文件 void main( ) //主函數(shù) { int a,b,c,d; //定義a , b , c , d 為整型變量 a=15; b= -30; //賦初值 unsigned int x; //定義x為無符號整型變量 x=25; //賦初值 c=a+x; d=b+x; //變量運(yùn)算 printf("a+x=%d, b+x=%d\n",c,d); //打印輸出結(jié)果 }
該程序可以在Keil μ Vision3集成開發(fā)環(huán)境中運(yùn)行,執(zhí)行的結(jié)果如下。
a+x=40, b+x=-5
在本例中,int型數(shù)據(jù)與unsingned int型數(shù)據(jù)進(jìn)行相加減的算術(shù)運(yùn)算,由此可以看出,不同類型的整型數(shù)據(jù)之間可以進(jìn)行算術(shù)運(yùn)算。
3.4.3 浮點(diǎn)型變量
浮點(diǎn)型變量是用于表示包含小數(shù)點(diǎn)的數(shù)據(jù)類型。浮點(diǎn)型變量的一般定義格式是“類型說明符 變量標(biāo)識符,變量標(biāo)識符...”,示例如下。
float a, b; //定義a、b為單精度浮點(diǎn)型變量 double c, d; //定義c、d為雙精度浮點(diǎn)型變量
同整型變量一樣,浮點(diǎn)型變量也可以同時定義多個。C51支持3種浮點(diǎn)型變量類型,即float類型、double類型和long double類型。但是在C51中不具體區(qū)分這3種類型,它們都被當(dāng)作float類型對待,因此,這3種浮點(diǎn)類型的精度和取值范圍相同。浮點(diǎn)類型變量的字長為4個字節(jié),共32位二進(jìn)制數(shù),取值范圍為3.4x10-38~3.4x10+38。浮點(diǎn)型變量的示例程序如下。
#include <stdio.h> //頭文件 void main( ) //主函數(shù) { float a; //定義a為單精度浮點(diǎn)型變量 double b; //定義b為雙精度浮點(diǎn)型變量 a=8976.1538; //賦值 b=6950.2692; printf("a=%f\nb=%f\n",a,b); //打印輸出結(jié)果 }
該程序可在Keil μ Vision3集成開發(fā)環(huán)境中運(yùn)行,執(zhí)行結(jié)果如下。
a=8976.154000 b=6950.269000
在本例中,a為單精度浮點(diǎn)型變量,有效位數(shù)是7位,因此最后四舍五入為8976.154。b為雙精度浮點(diǎn)型變量,但在C51中仍按float型處理,所以有效位數(shù)也是7位,因此最后四舍五入為6950.269。
注意
在C51中,浮點(diǎn)型數(shù)據(jù)均為有符號浮點(diǎn)數(shù),而沒有無符號浮點(diǎn)數(shù),字節(jié)最高位表示數(shù)據(jù)的符號,所以浮點(diǎn)型變量的有效位數(shù)是7位。
3.4.4 字符型變量
在信息的表示和傳遞中,經(jīng)常用到字符以及文字的表示。字符型變量就是用來存放單個字符的變量類型。字符型變量的定義格式是“類型說明符變量標(biāo)識符,變量標(biāo)識符...”。示例如下。
char a: //定義a為有符號字符變量 unsigned char b; //定義b為無符號字符變量
在C51中,可以定義兩種類型的字符型變量為有符號字符變量char和無符號字符變量unsigned char。在C51中,字符型變量在操作時將按整型變量處理。字符是以ASCII碼方式表示的,其字長為1個字節(jié),所以有符號字符型變量的取值范圍為-128~127,無符號字符型變量的取值范圍是0~255。如果某個變量被定義成char,則表明該變量是有符號的,即它將轉(zhuǎn)換成有符號的整型變量。字符型變量使用的示例程序如下。
#include <stdio.h> //頭文件 void main() //主函數(shù) { char c1,c2,c3,c4; //定義字符變量 c1=65; //賦值 c2=66; //賦值 c3='A'; c4='B'; printf("c1=%c\nc2=%c\nc3=%c\nc4=%c",c1,c2,c3,c4); //輸出結(jié)果 }
該程序可在Keil μ Vision3集成開發(fā)環(huán)境中運(yùn)行,執(zhí)行結(jié)果如下。
c1=A c2=B c3=A c4=B
程序中,c1、c2、c3、c4被定義為字符變量。其中,c3和c4分別賦值兩個字符,因此輸出結(jié)果為字符。c1和c2分別賦值十進(jìn)制整數(shù)65和66,因?yàn)樽址鸄和B的ASCII碼值分別為65和66,因此程序中使用“%c”來表示輸出時將輸出其對應(yīng)的字符。對c1和c2的賦值相當(dāng)于以下的賦值語句。
c1 = 'A'; c2 = 'B' ;
在實(shí)際使用中,常會需要存放一個字符串,這時就需要定義一個字符型數(shù)組,將字符串存放到該數(shù)組中來表示。定義字符串?dāng)?shù)組的示例程序如下。
#include <stdio.h> //頭文件 void main() //主函數(shù) { char str[5]; //定義字符型數(shù)組 str [0]='T'; //賦值 str [1]='e'; //賦值 str [2]='s'; //賦值 str [3]='t'; //賦值 printf("str=%s",str); //打印輸出結(jié)果 }
在程序編譯時,系統(tǒng)將留出str [0]到str [4]共5個字符的連續(xù)空間,其中只有前4個可以自由賦值,最后一個用來存放字符串終止符“NULL”,即“\0”。
這段程序可在Keil μ Vision3集成開發(fā)環(huán)境中運(yùn)行,執(zhí)行結(jié)果如下。
str=Test
注意
終止符“NULL”是編譯程序默認(rèn)自動加上的,程序中絕對不能為最后一個賦值。如果對最后一個進(jìn)行賦值,將導(dǎo)致程序的錯誤輸出。
3.4.5 指針型變量
指針型變量是指向變量所存放地址的數(shù)據(jù)類型。在C51中,指針型變量的定義格式是“類型說明符變量標(biāo)識符,變量標(biāo)識符...”,示例如下。
int *i; //定義整型指針變量 float *f; //定義浮點(diǎn)型指針變量 char *c; //定義字符型指針變量 struct *stu; //定義結(jié)構(gòu)型指針變量 union *uni; //定義聯(lián)合指針變量
指針型變量是一種特殊的數(shù)據(jù)類型,從上面可以看出,根據(jù)所指的變量類型不同,指針型變量可以分為整型指針、浮點(diǎn)型指針、字符型指針、結(jié)構(gòu)型指針和聯(lián)合指針。指針型變量的字長由所指向的變量類型決定。這里以字符型指針變量為例介紹指針型數(shù)據(jù)的使用,程序示例如下。
#include <stdio.h> //頭文件 void main() //主函數(shù) { char a1; //定義字符型變量 char *p; //定義字符型指針 a1='A'; //變量賦值 p=&a1; //將變量a1的地址賦給p printf("*p=%c",*p); //輸出地址p中所存的數(shù)據(jù)內(nèi)容 }
這段程序可在Keil μ Vision3集成開發(fā)環(huán)境中運(yùn)行,執(zhí)行結(jié)果如下。
*p=A
在該程序中,首先給字符型變量a1賦值'A',然后將a1的地址賦給字符型指針變量p。這樣變量p所指向的地址內(nèi)存放的數(shù)據(jù)是'A'。
3.4.6 無值型變量
無值型變量是一個特殊的類型,其字節(jié)長度為0。無值型變量的定義格式是“類型說明符 變量標(biāo)識符,變量標(biāo)識符...”,示例如下。
void *buf; //buf被定義為無值型指針
在C51中,無值型變量主要用于以下兩個方面。
?定義一個同一類型的指針,該指針可根據(jù)需要動態(tài)分配內(nèi)存。
?在自定義函數(shù)時,明確地表示這個函數(shù)不返回任何值。程序示例如下。
#include <stdio.h> //頭文件 void Fun1(int a) //定義一個無返回值的函數(shù) { printf("the number is %d",a); //輸出 } void main() //主函數(shù) { int i; //定義變量 i=12; //賦值 Fun1(i); //調(diào)用函數(shù) }
這段程序可在Keil μ Vision3集成開發(fā)環(huán)境中運(yùn)行,執(zhí)行結(jié)果如下。
the number is 12
在該程序中,先使用void自定義一個無返回值的函數(shù),在主函數(shù)中調(diào)用該函數(shù)并輸出結(jié)果。
- Python快樂編程:人工智能深度學(xué)習(xí)基礎(chǔ)
- HTML5移動Web開發(fā)技術(shù)
- C程序設(shè)計簡明教程(第二版)
- LabVIEW程序設(shè)計基礎(chǔ)與應(yīng)用
- Learning Docker
- Rust實(shí)戰(zhàn)
- Python爬蟲開發(fā)與項(xiàng)目實(shí)戰(zhàn)
- INSTANT Weka How-to
- Data Analysis with Stata
- Mastering KnockoutJS
- Web程序設(shè)計(第二版)
- Unity 5.x By Example
- NetBeans IDE 8 Cookbook
- Clojure for Java Developers
- Spring 5 Design Patterns