官术网_书友最值得收藏!

2.3 數(shù)據(jù)類型與存儲區(qū)域的使用

2.3.1 C語言的數(shù)據(jù)類型

一個程序應包括數(shù)據(jù)描述和操作步驟兩個方面。C語言中數(shù)據(jù)描述是以數(shù)據(jù)類型形式出現(xiàn)的。C語言的數(shù)據(jù)類型如表2-3所示。數(shù)據(jù)類型決定了數(shù)據(jù)所占內存字節(jié)數(shù)和數(shù)據(jù)取值范圍。數(shù)據(jù)類型所占字節(jié)數(shù)隨機器硬件不同而不同,表2-3是以IBM PC機為例的說明。C語言中數(shù)據(jù)有常量與變量之分,它們分別屬于圖2-2所示類型。

表2-3 數(shù)據(jù)類型概述

2.3.1.1 常量

在程序運行過程中,其值不能改變的量稱為常量,即常數(shù)。常量分為整型常量、實型常量、字符常量。

(1)標識符

用來標識變量名、符號常量名、函數(shù)名、數(shù)組名、類型名、文件名的有效字符序列稱為標識符。簡單地說,標識符就是一個名字。

C語言標識符的組成原則:①只能由字母、數(shù)字、下畫線組成,且第一個字符必須是字母或下畫線。②不能使用關鍵字。③大寫字母和小寫字母認為是兩個不同的字符,如sum和SUM表示不同的變量,變量名一般用小寫。④標識符長度(字符個數(shù))無統(tǒng)一規(guī)定,隨系而不同。許多系統(tǒng)取8個字符,假如程序中出現(xiàn)的變量名長度大于8個字符,則只有前面8個字符有效,后面的不被識別。例如,有兩個變量student_name和student_number,由于二者的前8個字符相同,系統(tǒng)認為這兩個變量是一回事而不加區(qū)別。因此,在寫程序時應了解所用系統(tǒng)對標識符長度的規(guī)定,以免出現(xiàn)上面的混淆,這種錯誤并不反映在編譯過程中(即無語法錯誤),但運行結果顯然不對。⑤標識符選擇時,應注意“見名知義”,即選有含義的英文單詞或其縮寫作標識符。

關鍵字:關鍵字是C語言規(guī)定的一批標識符,在源程序中代表固定的含義,不能另作他用。C51中除了支持ANSI標準C語言中關鍵字(見表2-1)外,還根據(jù)51系列單片機的結構特點擴展部分關鍵字,見表2-2。

預定義標識符:預定義標識符是指C語言提供的系統(tǒng)函數(shù)名和預編譯處理命令,如include等。C51語言語法允許用戶把這類標識符另作他用,但將使這些標識符失去系統(tǒng)規(guī)定的原意,因此,為了避免誤解,建議用戶不要把預定義標識符另作他用。

(2)符號常量

在C語言中可以用一個標識符代表一個常量,但必須先定義。

  

符號常量不同于變量,它的值在其作用域內不能改變,也不能再被賦值。如再用以下賦值語句給PRICE賦值是錯誤的。

PRICE=40;

習慣上,符號常量名用大寫,變量用小寫,以示區(qū)別。

(3)整型常量

整型常量即整常數(shù)。C語言整常數(shù)可用以下三種形式表示:

①十進制整數(shù):由數(shù)字0~9和正負號表示。如123,-456,0。

②八進制整數(shù):由數(shù)字0開頭,后跟數(shù)字0~7表示。如0123,011。

③十六進制整數(shù):由0x開頭,后跟0~9,a~f,A~F表示。如0x123,0xff。

整型常量的類型:根據(jù)其值所在范圍確定其數(shù)據(jù)類型。一個整常量,如果其值在-32768~+32767范圍內,認為它是int型,如果其值超過了上述范圍,而在-2147483648~+2147483647范圍內,則認為它是long int型。

在整常量后加字母l或L,認為它是long int型常量。

(4)實型常量

實型常量又稱實數(shù)或浮點數(shù)。在C語言中,實數(shù)有兩種表示形式,均采用十進制數(shù),默認格式輸出時最多只保留6位小數(shù)。

①十進制數(shù)形式。它由數(shù)字和小數(shù)點組成(注意必須有小數(shù)點)。如0.123,.123,123.0,123.,0.0都是合法的實型常量。

②指數(shù)形式。小數(shù)形式的實數(shù)E[±]整數(shù)。如2.3026可以寫成0.23026E1,或23.026E-1。e或E之前必須有數(shù)字;指數(shù)必須為整數(shù)。如:12.3e3,123E2,1.23e4是合法的,e-5,1.2E-3.5是不合法的。

實型常量默認double型,如在實型常量后加字母f或F,認為它是float型。

(5)字符常量

用單引號括起來的一個ASCII字符集中可顯示的字符或轉義字符稱為字符常量。

如:‘a'  ‘A'  ‘?'  ‘\n'  ‘\101’

轉義字符:意思是將反斜扛(\)后面的字符轉變成另外的意義。如‘\n’中的“n”不代表字母n而作為“換行”符。常用的轉義字符如表2-4所示。

表2-4 轉義字符及其含義

(6)字符串常量

字符串常量是用一對雙引號括起來的字符序列。如:“How do you do.”,“CHINA”,“a”,“$123.45”都是字符串常量。

不要將字符常量與字符串常量混淆。‘a’是字符常量,“a”是字符串常量。

2.3.1.2 變量

其值可以改變的量稱為變量。一個變量應該有一個名字,在內存中占據(jù)一定的存儲單元,在該存儲單元中存放變量的值。請注意區(qū)分變量名和變量值這兩個不同的概念。

在C語言中,要求對所有用到的變量作強制定義,也就是必須“先定義,后使用”,變量定義的一般格式:

數(shù)據(jù)類型[變量1,變量2,…,變量n];

數(shù)據(jù)類型:決定程序編譯時為變量分配內存單元字節(jié)數(shù)和數(shù)的表示范圍。

變量名:必須是合法的標識符。

變量分為整型變量、實型變量、字符變量。

(1)整型變量

整型變量分為有符號型和無符號型。有符號型包括int、short(int)、long(int)型。無符號型包括unsigned int、unsigned short、unsigned long型。它們所占內存單元數(shù)及數(shù)的范圍如表2-3所示。無符號型變量只能存放不帶符號的整數(shù),如123、4687等,而不能存放負數(shù),如-123、-3。無符號型變量在存儲單元中全部二進制位用作存放數(shù)本身,而不包括符號。

(2)實型變量

實型變量分為單精度型(float)和雙精度型(double)。

float:占4字節(jié),提供7位有效數(shù)字

double:占8字節(jié),提供15~16位有效數(shù)字。

(3)字符變量(char)

字符變量用來存放字符常量,注意只能放一個字符,不要以為在一個字符變量中可以放一個字符串。字符變量存放字符ASCII碼,在內存中占一個字節(jié)。

2.3.2 C51新增數(shù)據(jù)類型與存儲區(qū)域的使用

2.3.2.1 C51中新增的數(shù)據(jù)類型

C51中新增了數(shù)據(jù)類型bit、sbit、sfr、sfr16。

(1)bit

在51系列單片機的內部RAM中,可以位尋址的單元主要有兩大類:低128字節(jié)中的位尋址區(qū)(20H~2FH),高128字節(jié)中的可位尋址的SFR,有效的位地址共210個(其中位尋址區(qū)128個,可位尋址的SFR中有82個),可參見第1章表1-1與表1-2。

關鍵字bit可以定義存儲于位尋址區(qū)(20H~2FH)中的位變量。位變量的值只能是0或1。bit型變量的定義格式如下:

  

對關鍵字bit的使用有如下限制:

①不能定義位指針。如

  

②不能定義位數(shù)組。如

  

③用“#progma disable”說明的函數(shù)和用“using n”明確指定工作寄存器組的函數(shù)不能返回bit類型的值。

以上關鍵字bit的使用限制,讀者暫時可能不理解,待學完后續(xù)內容后就能理解。

(2)sbit

關鍵字sbit用于定義存儲在可位尋址的SFR中的位變量,為了區(qū)別bit型位變量,稱用sbit定義的位變量為SFR位變量。SFR位變量有以下3種定義方法:

①sbit位變量名=位地址;

②sbit位變量名=SFR單元名稱^變量位序號;

③sbit位變量名=SFR單元地址^變量位序號;

【例2-3】下列3種方式均可以定義P1口的P1.2引腳。

  

(3)sfr

利用sfr型變量可以訪問51系列單片機內部所有的8位特殊功能寄存器。sfr型變量的定義方法如下:

  

事實上,Keil C51編譯器已經(jīng)在相關的頭文件中對51系列單片機內部的所有sfr型變量和sbit型位變量進行了定義,在編寫程序時可以直接引用,例如打開頭文件“reg51.h”,可以看到以下內容。

  

  

  

因此,只要在程序的開頭添加了#include<reg51.h>,對reg51.h中已經(jīng)定義了的sfr型、sbit型變量,如無特殊需要則不必重新定義,直接引用即可。值得注意的是,在reg51.h中未給出4個I/O口(P0~P3)的引腳定義。

(4)sfr16

sfr16可以訪問51系列單片機內部的16位特殊功能寄存器,sfr16的定義方法與sfr類似。

2.3.2.2 存儲區(qū)域的使用

51系列單片機應用系統(tǒng)的存儲器結構如圖2-3所示,包括5個部分:片內程序存儲器(片內ROM)、片外程序存儲器(片外ROM)、片內數(shù)據(jù)存儲器(片內RAM)、片內特殊功能寄存器(SFR)、片外數(shù)據(jù)存儲器(片外RAM)。

圖2-3 51單片機應用系統(tǒng)的存儲器結構

針對51系列單片機應用系統(tǒng)存儲器的結構特點,C51編譯器把數(shù)據(jù)的存儲區(qū)域分為6種:data、bdata、idata、xdata、pdata、code,見表2-5。在使用C51語言進行程序設計時,可以把每個變量明確地分配到某個存儲區(qū)域中。由于對內部存儲器的訪問比對外部存儲器的訪問快許多,因此應當將頻繁使用的變量存放在片內RAM中,而把較少使用的變量存放在片外RAM中。

表2-5 C51語言中變量的存儲區(qū)域

有了存儲區(qū)域的概念后,變量的定義格式變?yōu)椋?/p>

數(shù)據(jù)類型[存儲區(qū)域]變量名稱;

【例2-4】存儲區(qū)域的使用。

  

在使用存儲區(qū)域時,還應該注意以下幾點:

①標準變量和用戶自定義變量都可以存儲在data區(qū)中,只要不超過data區(qū)范圍即可。由于51系列單片機沒有硬件報錯機制,當設置在data區(qū)的內部堆棧溢出時,程序會莫名其妙地復位。為此,要根據(jù)需要聲明足夠大的堆棧空間以防止堆棧溢出。

②C51編譯器不允許在bdata區(qū)中聲明float和double型的變量。

③對pdata和xdata的操作是相似的。但是,對pdata區(qū)的尋址要比對xdata區(qū)的尋址快,因為對pdata區(qū)的尋址只需裝入8位地址;而對xdata區(qū)的尋址需裝入16位地址,所以要盡量把外部數(shù)據(jù)存儲在pdata區(qū)中。

④程序存儲區(qū)的數(shù)據(jù)是不可改變的,編譯的時候要對程序存儲區(qū)中的對象進行初始化,否則就會產生錯誤。

主站蜘蛛池模板: 鄂伦春自治旗| 宿松县| 潮州市| 仁化县| 朝阳县| 舞钢市| 曲麻莱县| 静安区| 枞阳县| 烟台市| 东阳市| 高尔夫| 伊通| 宽甸| 新竹市| 页游| 满洲里市| 柘城县| 江达县| 庆阳市| 开江县| 平原县| 舒兰市| 嘉黎县| 湘阴县| 五河县| 梅州市| 石门县| 交城县| 西盟| 黄平县| 民县| 大庆市| 绥阳县| 南宫市| 桂东县| 大渡口区| 赣州市| 左云县| 儋州市| 图片|