C51语言支持哪些数据类型,C51编译器支持的数据类型(1)
1.1 C-51 編譯器支持下列數據類型:
數 據 類 型
長 度
值 域
bit
1 字節
0 或 1
signed char
1 字節
-128~+127
unsigned char
1 字節
0~255
signed int
2 字節
-32768~+32867
unsigned int
2 字節
0~65535
signed long
4 字節
-2147483648~+2147483647
unsigned long
4 字節
0~4294967295
float
4 字節
±1.176E-38~±3.40E+38
指針
1~3 字節
對象地址
sbit
1 位
0 或 1
sfr
1 字節
0~255
sfr16
2 字節
0~65535
編譯的數據類型(如結構)包含上表所列的數據類型。由于8051系列是8位機,因而不存在字節校準問題。這意味著數據結構成員是順序放置的。 數據類型的轉換:當計算結果隱含著另外一種數據類型時,數據類型可以自動進行轉換,例如,將一個位變量賦給一個整型變量時,位型值自動轉換為整型值,有符號變量的符號也能自動進行處理。這些轉換也可以用C語言的標準指令進行人工轉換。
1.2
數據類型的物理結構
1.2.1 bit
“bit”類型只有1位,不允許有位指針和位數組。位對象始終位于8051
CPU的可尋址RAM空間。如果程序控制流允許,L51將位對象交迭。
1.2.2 signed/unsigned char;data/idata/pdata 指針
“char”類型標量和基于存貯器的“data/idata/pdata”指針具有1個字節長度(8 bits)。
1.2.3 signed/unsigned int/short;xdata/code 指針
“int”和“short”類型標量及指向xdata/code區域的指針具有2字節長度(16
bits)。
整型值(或偏移)0x1234以下面方式保存在內存中:
地址: +0 +1
內容: 0x12 0x34 1.2.4 signed/unsigned
long
“long”類型標量長為4個字節(32 bits),值0x12345678以下面方式放置:
地址: +0 +1 +2 +3
內容: 0x12 0x34 0x56 0x78
1.2.5
“一般”指針
“一般”指針包括3個字節:2字節偏移和1字節存貯器類型:
地址: +0 +1 +2
內容: 存貯器類型 偏移高位 偏移低位
第一個字節代表了指針的存貯器類型,存貯器類型編碼如下:
存貯器類型 IDATA XDATA PDATA DATA CODE
值 1 2 3 4 5
使用其它類型值可能導致不可預測的程序動作。
XDATA類型的0x1234地址作為指針表示如下:
地址: +0 +1 +2
內容: 0x02 0x12 0x34
當用常數作指針時,必須注意正確定義存貯器類型和偏移。下例將值0x41寫入絕對地址為0x8000的外部數據存貯器:
#define XBYTE ((char *)0x20000L)
XBYTE[0x8000]=0x41;
上例中用其它常數索引或索引變量也起作用。這樣,各種存貯器類型的絕對地址可以一種非常有效的方式訪問。但有一個例外,即SFR。
注意:絕對地址定義為“long”型常量,低16位包含偏移,高8位表明了xdata類型。為了表示這種指針,必須用長整數來定義存貯器類型。
C51編譯器不檢查指針常數,用戶必須選擇有實際意義的值。
1.2.6
float
“float”類型為4個字節(32位),使用的格式與IEEE-754標準(32位)具有24位精度,尾數的高位始終為“1”,因而不保存,位的分布如下:
l 1位符號
l 8位指數位
l 23位尾數
符號位是最高位,尾數為最低的位,內存中按字節存貯如下:
地址: +0 +1 +2 +3
內容: MMMM MMMM MMMM MMMM E MMM MMMM S EEE EEEE
其中: S:符號位,1=負,0=正
E:指數(在兩個字節中),偏移為127
M:23位尾數,最高位“1”
浮點值——12.5的十六進制為0xC1480000,它按下面方式存貯:
地址: +0 +1 +2 +3
內容: 0x00 0x00 0x48 0xc1
8051不包括捕獲浮點錯誤(例外)的中斷向量。用戶軟件因此必須對錯誤條件作出適當反應。下面推薦一種方法(也可以用其它可靠辦法):“union”用來保存浮點值,這個“union”必須包括一個“float”和一個“unsigned
long”,以根據IEEE對錯誤作出響應。除了通常浮點值外,IEEE標準可能出錯的條件以下面二進制值表示,為檢查可能出現的計算錯誤,可在計算后進行檢查。因為當執行一個運算時考慮了每個運算符的錯誤狀態并且該狀態被送到結果中。
NaN 0xFFFFFFF 不是一個數
+INF 0x7F80000 正無窮(正溢出)
-INF 0XFF80000 負無窮(負溢出)
1.3 C-51 的擴充定義
1.3.1 特殊功能寄存器的聲明
MSC-51
系列包括多種寄存器,其中一些具有特殊功能,如定時器,端口的控制寄存器等,為了能夠直接訪問這些寄存器,C51編譯器提供了一種定義的自主形式,這是必要的,因為這些定義與標準C語言是不兼容的。
為了支持這些特殊功能寄存器(SFR)的聲明,引入了關鍵詞“sfr”,語法如下:
sfr-dcl:sfr sfr_name=int_constant
例:
sfr p0=0x80;
sfr p1=0x90;
必須注意的是“sfr”后不是一個地址而是一個名字。因此上例中名字P0和P1(port0和port1)定義為特殊功能寄存器并被賦予相應的絕對地址,名字可按意愿自由選取,源文件中不應有先定義的sfr名字。
“=”號后的地址必須是常數,不允許帶有運算符的表達式,這個常數表達式必須在特殊功能寄存器的地址范圍內,位于0X80到0XFF之間。
8051系列寄存器數量和類型是極其不同的,因此建議將所有特別的“sfr”聲明放入一個頭文件,頭文件包括8051一些系列成員中的SFR定義。進一步的定義可由用戶用一文件編輯器產生。
1.3.2
對SFR的16位數據訪問
在新的8051系列產品中,SFR在功能上經常組合為16位的,為了有效的訪問這類SFR,使用定義“sfr16”,當“SFR”的高端直接位于低端后時,對SFR16位的訪問是可能的。例如8052的定時器2就是這種情況,16位聲明的語法與“sfr”相同,SFR低地址部分必須作為sfr16的地址:
例:sfr16 T2=0xCC
sfr16 RCAP2=0xCA
本例中,T2(由T2L和T2H組成)和RCAP2(由RCAP2L和RCAP2H組成)被定義為16位SFR,即使在這種情況下,聲明中的名字后仍不是賦值語句,而是一個SFR地址,高字節必須直接位于低字節之后,這種聲明適用于所有新的SFR,但不能用于Timer0和Timer1。
1.3.3
SBIT:特殊功能位聲明
在典型的8051應用問題中,經常需要單獨訪問SFR中的位,C51擴充功能使之成為可能,特殊位,象SFR一樣,不與標準C語言兼容,使用保留字“sbit”可訪問位尋址對象。與SFR聲明一樣,用保留字“sbit”聲明某些特殊位接受符號名,“=”后語句將絕對值地址賦給變量名,這種地址分配有三種方法:
方法1:sfr_name^int_constant
當字節是特殊功能寄存器的地址可用這個方法。sfr_name必須是已定義的SFR的名字,“^”后的語句定義了基地址上的特殊位的位置,該位置必須是一個0~7的數。
例: sfr PSW="0xD0";
sfr LE="0xA8";
sbit OV="PSW"^2;
sbit CY="PSW"^7;
方法2:int_constant^int_constant
這種方法以一整常數作基地址,該值必須在0x80~0xFF之間,并能被8整除,確定位的位置方法同上。
例: sbit OV="0xD0"^2;
sbit CV="0xD0"^7;
sbit EA="0xA8"^7;
方法3: int_constant
這種方法是將位的絕對地址賦給變量,地址必須位于0x80~0xFF之間。
例: sbit OV="0xD2";
sbit CY="0xD7";
sbit EA="0xAF";
特殊功能位代表了一個獨立的聲明類,它不能與其它聲明和位域互換。
1.3.4
BIT:位標量聲明
除了通常的C數據類型外,C51編譯器支持“bit”數據類型,對此有下列擴充與限制:
(1) 函數可包含類型為“bit”的參數,也可將其作為返回值。
bit bfunc(bit b0,bit b1){
return(b1);
}
注:使用禁止中斷(#pragma disable)或包含明確的寄存器組切換(using
n)的函數不能返回位值,在這種情況下,編譯器會識別出來并產生一個錯誤信息。
(2) 位標量聲明的語法及C聲明的語義
static bit dirction_bit;
extern bit lock_printer_port;
bit display_invers;
(3) 對于位聲明的限制
l 位不能聲明為一個指針(bit *bit_poiter)
l 不存在位數組(bit b_array[5])
位聲明中允許定義存貯器類型,位都被放入一個位段,它總是在8051內部RAM中,因此存貯器類型限制為DATA或IDATA,聲明為其它存貯器類型都將導致編譯出錯。
1.3.5
可位尋址對象
可位尋址對象指可以字節或位尋址的對象,當對象位于MSC-51可尋址RAM中時會有這種情況,C51允許帶“bdata”類型的對象放入可位尋址存貯器中。
bdata int ibase;
bdata char bary[4];
使用“sbit”聲明可獨立訪問可位尋址對象的位:
sbit mybit0=ibase^0;
sbit mybit15=ibase^15;
sbit ary07=bary[0]^7;
sbit ary37=bary[3]^7;
對象“ibase”和“bary”也可位尋址:
ary37=0;
ibase=-1;
mybit15=0;
sbit聲明要求基址對象的存貯器類型為“bdata”,否則只有絕對的位聲明方法是合法的。位位置(‘^’操作符號后)的最大值依賴于指定的基類型,這個值于char/uchar而言是0~7,對于int/uint/short/ushort而言是0~15,對于long/ulong而言是0~31。
在編譯器內存貯器類型bdata與data一樣操作,并且只作與可再定位的sbit的運算。注:可位尋址的的段長最大不能超過16字節,可再定位的sbit聲明自動轉為公共的(PBULIC)以使它們能被其它C模塊使用。
模塊1: sbit ary37=bary[3]^7;
模塊2: extern bit ary37;
sbit聲明也可為結構和函數所用:
union lft {float mf;long ml;} ;
bdata struct bad { char ml; union lft u; }tcp;
sbit tcpf31=tcp.u.ml^31;
sbit tcpml0=tcp.ml^0;
sbit tcmpl7=tcp.ml.^7;
注:位位置的指定不能直接被float類型所用,如果需要這樣做,浮點標量必須與一個長整型標量一起放入一個聯合中并且位位置必須由長整型標題指定(見上例)。
總結
以上是生活随笔為你收集整理的C51语言支持哪些数据类型,C51编译器支持的数据类型(1)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c语言fmt,Go 标准库-fmt
- 下一篇: android菜单点击功能怎么做的,单击