第3章C51數(shù)據(jù)與運算_第1頁
第3章C51數(shù)據(jù)與運算_第2頁
第3章C51數(shù)據(jù)與運算_第3頁
第3章C51數(shù)據(jù)與運算_第4頁
第3章C51數(shù)據(jù)與運算_第5頁
已閱讀5頁,還剩67頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

第三章

C51數(shù)據(jù)與運算

§3.1數(shù)據(jù)與數(shù)據(jù)類型數(shù)據(jù)——具有一定格式的數(shù)字或數(shù)值叫做數(shù)據(jù)數(shù)據(jù)類型——數(shù)據(jù)的不同格式叫做數(shù)據(jù)類型數(shù)據(jù)結(jié)構(gòu)——數(shù)據(jù)按一定的數(shù)據(jù)類型進(jìn)行的排列、組合、架構(gòu)。C51編譯器具體支持的數(shù)據(jù)類型:位型,無符號字符,有符號字符,無符號整型,有符號整型,無符號長型,有符號長型,浮點和指針類型等C51數(shù)據(jù)類型與標(biāo)準(zhǔn)C數(shù)據(jù)類型的最大不同之處:位型位型(bit)字符型(char)整型(int)長整型(long)浮點型(float)雙精度浮點型(double)數(shù)組類型(array)結(jié)構(gòu)體類型(struct)共用體(union)枚舉(enum)基本類型構(gòu)造類型指針類型空類型數(shù)據(jù)類型表3-1KEILC51的數(shù)據(jù)類型數(shù)據(jù)類型長度(bit)長度(byte)值域bit110,1unsignedchar810~255signedchar81–128~127unsignedint1620~65535signedint162–32768~32767unsignedlong3240~4294967295signedlong324–2147483648~2147483647float324±1.176E–38~±3.40E+38(6位數(shù)字)double648±1.176E–38~±3.40E+38(10位數(shù)字)一般指針243存儲空間0~65535在C51語言程序中,有可能會出現(xiàn)在運算中數(shù)據(jù)類型不一致的情況。C51允許任何標(biāo)準(zhǔn)數(shù)據(jù)類型的隱式轉(zhuǎn)換,隱式轉(zhuǎn)換的優(yōu)先級順序如下:

bitcharintlongfloat

unsignedsigned也就是說,當(dāng)char型與int型進(jìn)行運算時,先自動對char型擴(kuò)展為int型,然后與int型進(jìn)行運算,運算結(jié)果為int型。C51除了支持隱式類型轉(zhuǎn)換外,還可以通過強制類型轉(zhuǎn)換符“()”對數(shù)據(jù)類型進(jìn)行人為的強制轉(zhuǎn)換。C5l編譯器除了能支持以上這些基本數(shù)據(jù)類型之外,還能支持一些復(fù)雜的組合型數(shù)據(jù)類型,如數(shù)組類型、指針類型、結(jié)構(gòu)類型、聯(lián)合類型等這些復(fù)雜的數(shù)據(jù)類型。

常量是指在程序執(zhí)行過程中其值不能改變的量。在C51中支持整型常量、浮點型常量、字符型常量和字符串型常量。一、整型常量整型常量也就是整型常數(shù),根據(jù)其值范圍在計算機(jī)中分配不同的字節(jié)數(shù)來存放。在C51中它可以表示成以下幾種形式:十進(jìn)制整數(shù)。如234、-56、0等。十六進(jìn)制整數(shù)。以0x開頭表示,如0x12表示十六進(jìn)制數(shù)12H。長整數(shù)。在C51中當(dāng)一個整數(shù)的值達(dá)到長整型的范圍,則該數(shù)按長整型存放,在存儲器中占四個字節(jié),另外,如一個整數(shù)后面加一個字母L,這個數(shù)在存儲器中也按長整型存放。如123L在存儲器中占四個字節(jié)?!?.2常量與變量二.浮點型常量浮點型常量也就是實型常數(shù)。有十進(jìn)制表示形式和指數(shù)表示形式。十進(jìn)制表示形式又稱定點表示形式,由數(shù)字和小數(shù)點組成。如0.123、34.645等都是十進(jìn)制數(shù)表示形式的浮點型常量。指數(shù)表示形式為:[]數(shù)字[.數(shù)字]e[]數(shù)字例如:123.456e-3、-3.123e2等都是指數(shù)形式的浮點型常量。三.字符型常量字符型常量是用單引號引起的字符,如‘a(chǎn)’、‘1’、‘F’等??梢允强娠@示的ASCII字符,也可以是不可顯示的控制字符。對不可顯示的控制字符須在前面加上反斜杠“\”組成轉(zhuǎn)義字符。利用它可以完成一些特殊功能和輸出時的格式控制。常用的轉(zhuǎn)義字符如下表所示。

轉(zhuǎn)義字符含義ASCII碼(十六進(jìn)制數(shù))\o空字符(null)00H\n換行符(LF)0AH\r回車符(CR)0DH\t水平制表符(HT)09H\b退格符(BS)08H\f換頁符(FF)0CH\‘單引號27H\”雙引號22H\\反斜杠5CH四.字符串型常量字符串型常量由雙引號“”括起的字符組成。如“D”、“1234”、“ABCD”等。注意字符串常量與字符常量是不一樣,一個字符常量在計算機(jī)內(nèi)只用一個字節(jié)存放,而一個字符串常量在內(nèi)存中存放時不僅雙引號內(nèi)的字符一個占一個字節(jié),而且系統(tǒng)會自動的在后面加一個轉(zhuǎn)義字符“\o”作為字符串結(jié)束符。因此不要將字符常量和字符串常量混淆,如字符常量‘A’和字符串常量“A”是不一樣的。常量——在程序運行的過程中,其值不能改變的。變量——在程序運行中,其值可以改變的。一個變量由兩部分組成:變量名和變量值。

習(xí)慣上,符號常量名用大寫,變量用小寫,以示區(qū)別。#defineCONST60main(){ intvariable,result; variable=20; result=variable*CONST; printf("result=%d\n",result);}只有bit和unsignedchar兩種數(shù)據(jù)類型可以直接支持機(jī)器指令,必須慎重變量和數(shù)據(jù)類型的選擇。

☆用C語言編寫單片機(jī)應(yīng)用程序與標(biāo)準(zhǔn)的C語言程序的區(qū)別:☆C語言編寫單片機(jī)應(yīng)用程序時,需根據(jù)單片機(jī)存儲結(jié)構(gòu)及內(nèi)部資源定義相應(yīng)的數(shù)據(jù)類型和變量,而標(biāo)準(zhǔn)的C語言程序不需要考慮這些問題C51包含的數(shù)據(jù)類型、變量存儲模式、輸入輸出處理、函數(shù)等方面與標(biāo)準(zhǔn)的C語言有一定的區(qū)別。其它的語法規(guī)則、程序結(jié)構(gòu)及程序設(shè)計方法等與標(biāo)準(zhǔn)的C語言程序設(shè)計相同。

C51的語法規(guī)定、程序結(jié)構(gòu)及程序設(shè)計方法都與標(biāo)準(zhǔn)的C語言程序設(shè)計相同,但C51程序與標(biāo)準(zhǔn)的C程序在以下幾個方面不一樣:(1)C51中定義的庫函數(shù)和標(biāo)準(zhǔn)C語言定義的庫函數(shù)不同。標(biāo)準(zhǔn)的C語言定義的庫函數(shù)是按通用微型計算機(jī)來定義的,而C51中的庫函數(shù)是按8051單片機(jī)相應(yīng)情況來定義的;(2)C51中的數(shù)據(jù)類型與標(biāo)準(zhǔn)C的數(shù)據(jù)類型也有一定的區(qū)別,在C51中還增加了幾種針對8051單片機(jī)特有的數(shù)據(jù)類型;(3)C51變量的存儲模式與標(biāo)準(zhǔn)C中變量的存儲模式不一樣,C51中變量的存儲模式是與8051單片機(jī)的存儲器緊密相關(guān);(4)C51與標(biāo)準(zhǔn)C的輸入輸出處理不一樣,C51中的輸入輸出是通過8051串行口來完成的,輸入輸出指令執(zhí)行前必須要對串行口進(jìn)行初始化;(5)C51與標(biāo)準(zhǔn)C在函數(shù)使用方面也有一定的區(qū)別,C51中有專門的中斷函數(shù)。變量是在程序運行過程中其值可以改變的量。一個變量由兩部分組成:變量名和變量值。在C51中,變量在使用前必須對變量進(jìn)行定義,指出變量的數(shù)據(jù)類型和存儲模式。以便編譯系統(tǒng)為它分配相應(yīng)的存儲單元,定義的格式如下[存儲種類]數(shù)據(jù)類型[存儲器類型]變量名表存儲種類存儲種類是指變量在程序執(zhí)行過程中的作用范圍。C51變量的存儲種類有四種,分別是自動(auto)、外部(extern)、靜態(tài)(static)和寄存器(register)。1.a(chǎn)uto:

使用auto定義的變量稱為自動變量,其作用范圍在定義它的函數(shù)體或復(fù)合語句內(nèi)部,當(dāng)定義它的函數(shù)體或復(fù)合語句執(zhí)行時,C51才為該變量分配內(nèi)存空間,結(jié)束時占用的內(nèi)存空間釋放。自動變量一般分配在內(nèi)存的堆??臻g中。定義變量時,如果省略存儲種類,則該變量默認(rèn)為自動(auto)變量。2.extern:

使用extern定義的變量稱為外部變量。在一個函數(shù)體內(nèi),要使用一個已在該函數(shù)體外或別的程序中定義過的外部變量時,該變量在該函數(shù)體內(nèi)要用extern說明。外部變量被定義后分配固定的內(nèi)存空間,在程序整個執(zhí)行時間內(nèi)都有效,直到程序結(jié)束才釋放。3.static:

使用static定義的變量稱為靜態(tài)變量。它又分為內(nèi)部靜態(tài)變量和外部靜態(tài)變量。在函數(shù)體內(nèi)部定義的靜態(tài)變量為內(nèi)部靜態(tài)變量,它在對應(yīng)的函數(shù)體內(nèi)有效,一直存在,但在函數(shù)體外不可見,這樣不僅使變量在定義它的函數(shù)體外被保護(hù),還可以實現(xiàn)當(dāng)離開函數(shù)時值不被改變。外部靜態(tài)變量上在函數(shù)外部定義的靜態(tài)變量。它在程序中一直存在,但在定義的范圍之外是不可見的。如在多文件或多模塊處理中,外部靜態(tài)變量只在文件內(nèi)部或模塊內(nèi)部有效。4.register:

使用register定義的變量稱為寄存器變量。它定義的變量存放在CPU內(nèi)部的寄存器中,處理速度快,但數(shù)目少。C51編譯器編譯時能自動識別程序中使用頻率最高的變量,并自動將其作為寄存器變量,用戶可以無需專門聲明。位變量(bit):與8051硬件特性操作有關(guān)的可以定義成位變量。位變量必須定位在8051單片機(jī)片內(nèi)RAM的位尋址空間中。字符變量(char):字符變量的長度為1byte即8位。這很合適8051單片機(jī),因為8051單片機(jī)每次可處理8位數(shù)據(jù)。對于無符號變量(unsignedchar)的值域范圍是0~255。對于有符號字符變量(signedchar),最具有重要意義的位是最高位上的符號標(biāo)志位(msb)。此位為1代表“負(fù)”,為0代表“正”。有符號字符變量和無符號字符變量在表示0~127的數(shù)值時,其含義是一樣的,都是0~0x7F。負(fù)數(shù)一般用補碼表示。整型變量(int):8051系列單片機(jī)將int型變量的高位字節(jié)數(shù)存放在低地址字節(jié)中,低位字節(jié)數(shù)存放在高地址字節(jié)中。有符號整型變量(signedint)也使用msb位作符號標(biāo)志位,并使用二進(jìn)制補碼表示數(shù)值??芍苯邮褂脦追N專用的機(jī)器指令來完成多字節(jié)的加、減、乘、除運算。圖3.2整型數(shù)的存儲結(jié)構(gòu)…0x120x34…+0+1地址0x120x340x560x78….+0+1+2+3地址圖3.3長整型變量的存儲結(jié)構(gòu)浮點型變量(float):浮點型變量為32位,占4個字節(jié),許多復(fù)雜的數(shù)學(xué)表達(dá)式都采用浮點變量數(shù)據(jù)類型。應(yīng)用符號位表示數(shù)的符號,用階碼和尾數(shù)表示數(shù)的大小。用它們進(jìn)行任何數(shù)學(xué)運算都需要使用由編譯器決定的各種不同效率等級的庫函數(shù)。KEILC51的浮點變量數(shù)據(jù)類型的使用格式與IEEE-754標(biāo)準(zhǔn)有關(guān),具有24位精度,尾數(shù)的高位始終為"1",因而不保存,位的分布如下:●1位符號位?!?位指數(shù)位?!?3位尾數(shù)。符號位是最高位,尾數(shù)為低23位,內(nèi)存中按字節(jié)存儲順序如下:地址+0+1+2+3內(nèi)容SEEEEEEEEMMMMMMMMMMMMMMM其中,S為符號位,1表示負(fù),0表示正;E為階碼;M為23位尾數(shù),最高位為“1”。一個浮點數(shù)的數(shù)值范圍是(-1)×2E-127×(1.M)浮點變量值-12.5的十進(jìn)制為:0xC1480000,它按圖3.4所示方式存于內(nèi)存中。MMMMMMMM0xC10x480x000x00+0+1+2+3地址使用簡化形式定義數(shù)據(jù)類型。其方法是在源程序開頭使用#define語句自定義簡化的類型標(biāo)識符。例如:#defineucharunsignedchar#defineuintunsignedint這樣,在編程中,就可以用uchar代替unsignedchar,用uint代替unsignedint來定義變量。8051系列機(jī)在物理上有四個存儲空間

1)片內(nèi)程序存儲器空間

2)片外程序存儲器空間

3)片內(nèi)數(shù)據(jù)存儲器空間

4)片外數(shù)據(jù)存儲器空間§3.3Cx51數(shù)據(jù)的存儲類型與8051存儲結(jié)構(gòu)

8051片內(nèi)數(shù)據(jù)存儲器可劃分為兩類: 00H~7FH為片內(nèi)低128字節(jié)RAM區(qū);

80H~0FFH為特殊功能寄存器區(qū)。

低字節(jié)RAM區(qū)又可以劃分為3個區(qū)域:

1)通用寄存器區(qū)(00H~1FH)

每個寄存器可以用寄存器名尋址,也可直接用字節(jié)地址尋址。

2)可位尋址區(qū)

可以按字節(jié)尋址操作,也可按位地址操作。

3)用戶RAM區(qū)程序存儲器與數(shù)據(jù)存儲器嚴(yán)格分開,特殊功能寄存器與片內(nèi)數(shù)據(jù)存儲器統(tǒng)一編址。

片內(nèi)數(shù)據(jù)存儲區(qū)是存放臨時性傳遞變量或使用頻率較高的變量的。

訪問片內(nèi)數(shù)據(jù)存儲器速度較快,經(jīng)常使用的變量置于片內(nèi)數(shù)據(jù)存儲器,而將不常用的置于片外數(shù)據(jù)存儲器中。尋址方式可使用直接和間接尋址。表3.2C51存儲器類型與8051存儲空間的對應(yīng)關(guān)系存儲器類型與存儲空間的對應(yīng)關(guān)系data直接尋址片內(nèi)數(shù)據(jù)存儲區(qū),訪問速度快(128字節(jié))bdata可位尋址片內(nèi)數(shù)據(jù)存儲區(qū),允許位與字節(jié)混合訪問(16字節(jié))idata間接尋址片內(nèi)數(shù)據(jù)存儲區(qū),可訪問片內(nèi)全部RAM地址空間(256字節(jié))pdata分頁尋址片外數(shù)據(jù)存儲區(qū)(256字節(jié))由MOV@Ri訪問(i=0,1)xdata片外數(shù)據(jù)存儲區(qū)(64KB)由MOVX@DPTR訪問code程序存儲器64KB空間,由MOVC@DPTR訪問表3.3C51存儲器類型及其數(shù)據(jù)長度和值域存儲器類型長度(bit)長度(byte)值域范圍data810~255idata810~255pdata810~255xdata1620~65535code1620~65535帶存儲類型的變量的定義的一般格式為:

[存儲種類]數(shù)據(jù)類型[存儲器類型]變量名帶存儲類型的變量定義舉例:chardatavar1;bitbdataflags;floatidatax,y,z;unsignedintpdatavar2;unsignedcharvector[3][4];表3.4存儲器模式說明存儲器模式說明SMALLSMALL模式稱為小編譯模式,默認(rèn)的存儲類型是data,參數(shù)及局部變量放入可直接尋址片內(nèi)RAM的用戶區(qū)中(最大128字節(jié))。另外所有對象(包括堆棧),都必須嵌入片內(nèi)RAM。棧長很關(guān)鍵,因為實際棧長依賴于函數(shù)嵌套調(diào)用層數(shù)COMPACTCOMPACT模式稱為緊湊編譯模式,默認(rèn)的存儲類型是pdata,參數(shù)及局部變量放入分頁的外部數(shù)據(jù)存儲區(qū),通過@R0或@R1間接訪問,棧空間位于片內(nèi)數(shù)據(jù)存儲區(qū)中LARGELARGE模式稱為大編譯模式,默認(rèn)的存儲類型是xdata,參數(shù)及局部變量直接放入片外數(shù)據(jù)存儲區(qū),使用數(shù)據(jù)指針DPTR來進(jìn)行尋址。用此數(shù)據(jù)指針進(jìn)行訪問效率較低,尤其對兩個或多個字節(jié)的變量,這種數(shù)據(jù)類型的訪問機(jī)制直接影響代碼的長度§3.48051特殊功能寄存器(SFR)的C51定義8051單片機(jī)中,除了程序計數(shù)器PC和4組工作寄存器組外,其它所有的寄存器均為特殊功能寄存器(SFR),分散在片內(nèi)RAM區(qū)的高128字節(jié)中,地址范圍為80H~0FFH。SFR中有11個寄存器具有位尋址能力,它們的字節(jié)地址都能被8整除,即字節(jié)地址是以8或0為尾數(shù)的。為了能直接訪問這些SFR,F(xiàn)ranklinC51提供了一種自主形式的定義方法,這種定義方法與標(biāo)準(zhǔn)C語言不兼容,只適用于對8051系列單片機(jī)進(jìn)行C語言編程。特殊功能寄存器C51定義的一般語法格式如下: sfrsfr_name=intconstant;"sfr"是定義語句的關(guān)鍵字,其后必須跟一個8051單片機(jī)真實存在的特殊功能寄存器名,"="后面必須是一個整型常數(shù),不允許帶有運算符的表達(dá)式,是特殊功能寄存器"sfr-name"的字節(jié)地址,這個常數(shù)值的范圍必須在SFR地址范圍內(nèi),位于0x80~0xFF。例如:sfrSCON=0x98; /*串口控制寄存器地址98H*/sfrTMOD=0x89; /*定時器/計數(shù)器方式控制寄存器地址89H*/8051系列單片機(jī)的特殊功能寄存器的數(shù)量與類型不盡相同,因此建議將所有特殊的"sfr"定義放入一個頭文件中,該文件應(yīng)包括8051單片機(jī)系列機(jī)型中的SFR定義。C51編譯器的"reg51.h"頭文件就是這樣一個文件。在新的8051系列產(chǎn)品中,SFR在功能上經(jīng)常組合為16位值,當(dāng)SFR的高字節(jié)地址直接位于低字節(jié)之后時,對16位SFR的值可以直接進(jìn)行訪問。例如52子系列的定時器/計數(shù)器2就是這種情況。為了有效地訪問這類SFR,可使用關(guān)鍵字"sfr16"來定義,其定義語句的語法格式與8位SFR相同,只是"="后面的地址必須用16位SFR的低字節(jié)地址,即低字節(jié)地址作為"sfr16"的定義地址。例如:sfr16T2=0xCC /*定時器/計數(shù)器2:T2低8位地址為0CCH,T2高8位地址為0CDH*/這種定義適用于所有新的16位SFR,但不能用于定時器/計數(shù)器0和1。對于位尋址的SFR中的位,C51的擴(kuò)充功能支持特殊位的定義,像SFR一樣不與標(biāo)準(zhǔn)C兼容,使用"sbit"來定義位尋址單元。第一種方法:sbitbit-name=sfr-name^intconstant;"sbit"是定義語句的關(guān)鍵字,后跟一個尋址位符號名(該位符號名必須是8051單片機(jī)中規(guī)定的位名稱),"="后的"sfr-name"必須是已定義過的SFR的名字,"^"后的整常數(shù)是尋址位在特殊功能寄存器"sfr-name"中的位號,必須是0~7范圍中的數(shù)。例如:sfrPSW=0xD0; /*定義PSW寄存器地址為D0H*/sbitOV=PSW^2; /*定義OV位為PSW.2,地址為D2H*/sbitCY=PSW^7; /*定義CY位為PSW.7,地址為D7H*/第二種方法:sbitbit-name=intconstant^intconstant;"="后的intconstant為尋址地址位所在的特殊功能寄存器的字節(jié)地址,"^"符號后的intconstant為尋址位在特殊功能寄存器中的位號。例如:sbitOV=0xD0^2; /*定義OV位地址是D0H字節(jié) 中的第2位*/sbitCY=0xD0^7; /*定義CY位地址是D0H字節(jié)中 的第7位*/第三種方法:sbitbit-name=intconstant;"="后的intconstant為尋址位的絕對位地址。例如:sbitOV=0xD2; /*定義OV位地址為D2H*/sbitCY=0xD7; /*定義CY位地址為D7H*/特殊功能位代表了一個獨立的定義類,不能與其它位定義和位域互換?!?.58051并行接口及其Cx51定義8051系列單片機(jī)并行I/O接口除了芯片上的4個I/O口(P0~P3)外,還可以在片外擴(kuò)展I/O口。8051單片機(jī)I/O口與數(shù)據(jù)存儲器統(tǒng)一編址,即把一個I/O口當(dāng)作數(shù)據(jù)存儲器中的一個單元來看待。使用C51進(jìn)行編程時,8051片內(nèi)的I/O口與片外擴(kuò)展的I/O可以統(tǒng)一在一個頭文件中定義,也可以在程序中(一般在開始的位置)進(jìn)行定義,其定義方法如下:對于8051片內(nèi)I/O口按特殊功能寄存器方法定義。例如:sfrP0=0x80;/*定義P0口,地址為80H*/sfrP1=0x90;/*定義P1口,地址為90H*/對于片外擴(kuò)展I/O口,則根據(jù)硬件譯碼地址,將其視作為片外數(shù)據(jù)存儲器的一個單元,使用#define語句進(jìn)行定義。例如#include<absacc.h>#definePORTAXBYTE[0xFFC0]absacc.h是C51中絕對地址訪問函數(shù)的頭文件,將PORTA定義為外部I/O口,地址為FFC0H,長度為8位。一旦在頭文件或程序中對這些片外I/O口進(jìn)行定義后,在程序中就可以自由使用變量名與其實際地址的聯(lián)系,以便使程序員能用軟件模擬8051的硬件操作。#include<reg51.h>#defineucharunsignedcharsbit DIPswitch=P1^4;sbit greenLED=P1^5;voidmain(void){ ucharinval; inval=0; while(1){ if(DIPswitch==1){ inval=P1&0x0f; greenLED=0; } else{ greenLED=1; } P3=(P3&0xf0)|inval; }}(1)位變量C51定義。使用C51編程時,定義了位變量后,就可以用定義了的變量來表示8051的位尋址單元。位變量的C51定義的一般語法格式如下:位類型標(biāo)識符(bit)位變量名;例如:bitdirection_bit; /*把direction_bit定義為位變量*/bitlook_pointer; /*把look_pointer定義為位變量*/§3.6位變量的C51定義(2)函數(shù)可包含類型為"bit"的參數(shù),也可以將其作為返回值。例如:

bitfunc(bitb0,bitb1) /*變量b0,b1作為函數(shù)的參數(shù)*/{return(b1); /*變量b1作為函數(shù)的返回值*/}注意,使用(#pragmadisable)或包含明確的寄存器組切換(usingn)的函數(shù)不能返回位值,否則編輯器將會給出一個錯誤信息?!?3)對位變量定義的限制。位變量不能定義成一個指針,如不能定義:bit*bit_pointer。不存在位數(shù)組,如不能定義:bitb_array[]。在位定義中,允許定義存儲類型,位變量都被放入一個位段,此段總位于8051片內(nèi)的RAM區(qū)中。因此,存儲類型限制為data和idata,如果將位變量的存儲類型定義成其它存儲類型都將編譯出錯。例1先定義變量的數(shù)據(jù)類型和存儲類型:bdataintibase; /*定義ibase為bdata整型變量*/bdatacharbary[4];/*bary[4]定義為bdata字符型數(shù)組*/然后可使用"sbit"定義可獨立尋址訪問的對象位:sbitmybit0=ibase^0; /*mybit0定義為ibase的第0位*/sbitmybit15=ibase^15; /*mybit0定義為ibase的第15位*/sbitAry07=bary[0]^7; /*Ary07定義為abry[0]的第7位*/sbitAry37=bary[3]^7; /*Ary37定義為abry[3]的第7位*/§3.7.1Cx51算術(shù)運算符及其運算符

賦值運算符賦值運算符“=”,在C51中,它的功能是將一個數(shù)據(jù)的值賦給一個變量,如x=10。利用賦值運算符將一個變量與一個表達(dá)式連接起來的式子稱為賦值表達(dá)式,在賦值表達(dá)式的后面加一個分號“;”就構(gòu)成了賦值語句,一個賦值語句的格式如下:

變量=表達(dá)式;執(zhí)行時先計算出右邊表達(dá)式的值,然后賦給左邊的變量。例如:x=8+9;/*將8+9的值賦紿變量x*/x=y=5;/*將常數(shù)5同時賦給變量x和y*/在C51中,允許在一個語句中同時給多個變量賦值,賦值順序自右向左?!?.7Cx51運算符、表達(dá)式及其規(guī)則C51中支持的算術(shù)運算符有: +加或取正值運算符 -減或取負(fù)值運算符*乘運算符 /除運算符%取余運算符加、減、乘運算相對比較簡單,而對于除運算,如相除的兩個數(shù)為浮點數(shù),則運算的結(jié)果也為浮點數(shù),如相除的兩個數(shù)為整數(shù),則運算的結(jié)果也為整數(shù),即為整除。如25.0/20.0結(jié)果為1.25,而25/20結(jié)果為1。對于取余運算,則要求參加運算的兩個數(shù)必須為整數(shù),運算結(jié)果為它們的余數(shù)。例如:x=5%3,結(jié)果x的值為2。2、算術(shù)表達(dá)式、優(yōu)先級與結(jié)合性

算術(shù)表達(dá)式:用算術(shù)運算符和括號將運算對象連接起來的式子,運算對象包括常量、變量、函數(shù)、數(shù)組和結(jié)構(gòu)等。如:a*b/c-2.5+d

優(yōu)先級——指當(dāng)運算對象兩側(cè)都有運算符時,執(zhí)行運算的先后次序。結(jié)合性——指當(dāng)一個運算對象兩側(cè)的運算符的優(yōu)先級別相同的運算順序。算術(shù)運算符的優(yōu)先級規(guī)定為:先乘除模,后加減,括號最優(yōu)先。運算符執(zhí)行的先后取決與運算符的優(yōu)先級,當(dāng)優(yōu)先級相同時,在看看結(jié)合性。如:a-b*c等價于a-(b*c)a*b/c等價于(a*b)/c圖中“”表示必定轉(zhuǎn)換。既使是同一種類型也按""轉(zhuǎn)換。即當(dāng)遇到char、short時,系統(tǒng)一律將其轉(zhuǎn)換為int參與運算,如‘a(chǎn)’+‘b’,先轉(zhuǎn)換為int,結(jié)果為int。而當(dāng)遇到float時,一律轉(zhuǎn)換為double參與運算。轉(zhuǎn)換方法:doublefloat高低longunsignedintchar,short+數(shù)據(jù)類型轉(zhuǎn)換1.自動(缺?。╊愋娃D(zhuǎn)換

可根據(jù)自己的意愿利用強制類型轉(zhuǎn)換運算符將一個算術(shù)表達(dá)式轉(zhuǎn)換為所需類型強制類型轉(zhuǎn)換格式:(類型名)(表達(dá)式)例如:(double)a將a轉(zhuǎn)換為double(int)(x+y)將x+y轉(zhuǎn)換為int(float)(5%3)將5%3轉(zhuǎn)換為float2.強制類型轉(zhuǎn)換運算符“()”§3.7.2、Cx51關(guān)系運算符、表達(dá)式及優(yōu)先級<小于>大于<=小于或等于>=大于或等于==測試等于!=測試不等于前4種關(guān)系運算符(<、>、<=、>=)優(yōu)先級相同,后兩種也相同;前4種優(yōu)先級高于后兩種2.關(guān)系運算符的優(yōu)先級關(guān)系運算符優(yōu)先級如右圖:算術(shù)運算符賦值運算符關(guān)系運算符高低舉例:c>a+bc>(a+b)a>b!=c(a>b)!=ca==b<ca==(b<c)a=b>ca=(b>c)關(guān)系運算符的結(jié)合性為左結(jié)合關(guān)系表達(dá)式:用關(guān)系運算符連接起來的表達(dá)式格式:<表達(dá)式><關(guān)系運算符><表達(dá)式>說明:關(guān)系表達(dá)式的結(jié)果只有兩種即“真”和“假”,其中“真”用“1”表示、“假”用“0”表示。判斷一個量是否為真時,等于0表示假,非0都是真。3.7.3、Cx51邏輯運算符、表達(dá)式及優(yōu)先級&&邏輯“與”(AND)||邏輯“或”(OR)!邏輯“非”(NOR)“&&”和“||”是雙目運算符,要求有兩個運算對象;而“!”是單目運算符,只要求有一個運算對象。邏輯表達(dá)式的結(jié)合性為自左向右

邏輯表達(dá)式:用邏輯運算符關(guān)系運算符或邏輯量連接起來的式子稱為邏輯表達(dá)式。

邏輯表達(dá)式的值應(yīng)該是一個邏輯量真或假邏輯表達(dá)式的值與關(guān)系表達(dá)式的值相同,以0代表假,以1代表真。例如:若a=8,b=3,c=0,則!a為假,a&&b為真,b&&c為假§3.7.4、Cx51位操作及其表達(dá)式&按位與 |按位或^按位異或 ~按位取反<<位左移 >>位右移除了按位取反運算符“~”以外,以上位操作運算符都是兩目運算符,即要求運算符兩側(cè)各有一個運算對象。位運算只能是整型或字符型數(shù),不能為實型數(shù)據(jù)“&”:參加運算的兩個運算對象,若兩者相應(yīng)的位都為1,則該位結(jié)果值為1,否則為0?!皘”:參加運算的兩個對象,若兩者相應(yīng)的位中有一個為1,則該位結(jié)果為1“^”:參加運算的兩個對象,若兩者相應(yīng)的位值相同,則結(jié)果為0;若兩者相應(yīng)的位值相異,則結(jié)果為1?!皛”是一個單目運算符,用來對一個二進(jìn)制數(shù)按位進(jìn)行取反,即0變1,1變0位左移、位右移運算符“<<”和”>>”,用來將一個數(shù)的各二進(jìn)制位的全部左移或右移若干位;移位后,空白位補0,而溢出位舍棄。【例】設(shè)a=0x54=01010100B, b=0x3b=00111011B,則a&b、a|b、a^b、~a、a<<2、b>>2分別為多少?a&b=00010

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論