日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

C51语言支持哪些数据类型,C51编译器支持的数据类型(1)

發(fā)布時(shí)間:2024/7/23 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C51语言支持哪些数据类型,C51编译器支持的数据类型(1) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

1.1 C-51 編譯器支持下列數(shù)據(jù)類型:

數(shù) 據(jù) 類 型

長 度

值 域

bit

1 字節(jié)

0 或 1

signed char

1 字節(jié)

-128~+127

unsigned char

1 字節(jié)

0~255

signed int

2 字節(jié)

-32768~+32867

unsigned int

2 字節(jié)

0~65535

signed long

4 字節(jié)

-2147483648~+2147483647

unsigned long

4 字節(jié)

0~4294967295

float

4 字節(jié)

±1.176E-38~±3.40E+38

指針

1~3 字節(jié)

對(duì)象地址

sbit

1 位

0 或 1

sfr

1 字節(jié)

0~255

sfr16

2 字節(jié)

0~65535

編譯的數(shù)據(jù)類型(如結(jié)構(gòu))包含上表所列的數(shù)據(jù)類型。由于8051系列是8位機(jī),因而不存在字節(jié)校準(zhǔn)問題。這意味著數(shù)據(jù)結(jié)構(gòu)成員是順序放置的。 數(shù)據(jù)類型的轉(zhuǎn)換:當(dāng)計(jì)算結(jié)果隱含著另外一種數(shù)據(jù)類型時(shí),數(shù)據(jù)類型可以自動(dòng)進(jìn)行轉(zhuǎn)換,例如,將一個(gè)位變量賦給一個(gè)整型變量時(shí),位型值自動(dòng)轉(zhuǎn)換為整型值,有符號(hào)變量的符號(hào)也能自動(dòng)進(jìn)行處理。這些轉(zhuǎn)換也可以用C語言的標(biāo)準(zhǔn)指令進(jìn)行人工轉(zhuǎn)換。

1.2

數(shù)據(jù)類型的物理結(jié)構(gòu)

1.2.1 bit

“bit”類型只有1位,不允許有位指針和位數(shù)組。位對(duì)象始終位于8051

CPU的可尋址RAM空間。如果程序控制流允許,L51將位對(duì)象交迭。

1.2.2 signed/unsigned char;data/idata/pdata 指針

“char”類型標(biāo)量和基于存貯器的“data/idata/pdata”指針具有1個(gè)字節(jié)長度(8 bits)。

1.2.3 signed/unsigned int/short;xdata/code 指針

“int”和“short”類型標(biāo)量及指向xdata/code區(qū)域的指針具有2字節(jié)長度(16

bits)。

整型值(或偏移)0x1234以下面方式保存在內(nèi)存中:

地址: +0 +1

內(nèi)容: 0x12 0x34 1.2.4 signed/unsigned

long

“l(fā)ong”類型標(biāo)量長為4個(gè)字節(jié)(32 bits),值0x12345678以下面方式放置:

地址: +0 +1 +2 +3

內(nèi)容: 0x12 0x34 0x56 0x78

1.2.5

“一般”指針

“一般”指針包括3個(gè)字節(jié):2字節(jié)偏移和1字節(jié)存貯器類型:

地址: +0 +1 +2

內(nèi)容: 存貯器類型 偏移高位 偏移低位

第一個(gè)字節(jié)代表了指針的存貯器類型,存貯器類型編碼如下:

存貯器類型 IDATA XDATA PDATA DATA CODE

值 1 2 3 4 5

使用其它類型值可能導(dǎo)致不可預(yù)測(cè)的程序動(dòng)作。

XDATA類型的0x1234地址作為指針表示如下:

地址: +0 +1 +2

內(nèi)容: 0x02 0x12 0x34

當(dāng)用常數(shù)作指針時(shí),必須注意正確定義存貯器類型和偏移。下例將值0x41寫入絕對(duì)地址為0x8000的外部數(shù)據(jù)存貯器:

#define XBYTE ((char *)0x20000L)

XBYTE[0x8000]=0x41;

上例中用其它常數(shù)索引或索引變量也起作用。這樣,各種存貯器類型的絕對(duì)地址可以一種非常有效的方式訪問。但有一個(gè)例外,即SFR。

注意:絕對(duì)地址定義為“l(fā)ong”型常量,低16位包含偏移,高8位表明了xdata類型。為了表示這種指針,必須用長整數(shù)來定義存貯器類型。

C51編譯器不檢查指針常數(shù),用戶必須選擇有實(shí)際意義的值。

1.2.6

float

“float”類型為4個(gè)字節(jié)(32位),使用的格式與IEEE-754標(biāo)準(zhǔn)(32位)具有24位精度,尾數(shù)的高位始終為“1”,因而不保存,位的分布如下:

l 1位符號(hào)

l 8位指數(shù)位

l 23位尾數(shù)

符號(hào)位是最高位,尾數(shù)為最低的位,內(nèi)存中按字節(jié)存貯如下:

地址: +0 +1 +2 +3

內(nèi)容: MMMM MMMM MMMM MMMM E MMM MMMM S EEE EEEE

其中: S:符號(hào)位,1=負(fù),0=正

E:指數(shù)(在兩個(gè)字節(jié)中),偏移為127

M:23位尾數(shù),最高位“1”

浮點(diǎn)值——12.5的十六進(jìn)制為0xC1480000,它按下面方式存貯:

地址: +0 +1 +2 +3

內(nèi)容: 0x00 0x00 0x48 0xc1

8051不包括捕獲浮點(diǎn)錯(cuò)誤(例外)的中斷向量。用戶軟件因此必須對(duì)錯(cuò)誤條件作出適當(dāng)反應(yīng)。下面推薦一種方法(也可以用其它可靠辦法):“union”用來保存浮點(diǎn)值,這個(gè)“union”必須包括一個(gè)“float”和一個(gè)“unsigned

long”,以根據(jù)IEEE對(duì)錯(cuò)誤作出響應(yīng)。除了通常浮點(diǎn)值外,IEEE標(biāo)準(zhǔn)可能出錯(cuò)的條件以下面二進(jìn)制值表示,為檢查可能出現(xiàn)的計(jì)算錯(cuò)誤,可在計(jì)算后進(jìn)行檢查。因?yàn)楫?dāng)執(zhí)行一個(gè)運(yùn)算時(shí)考慮了每個(gè)運(yùn)算符的錯(cuò)誤狀態(tài)并且該狀態(tài)被送到結(jié)果中。

NaN 0xFFFFFFF 不是一個(gè)數(shù)

+INF 0x7F80000 正無窮(正溢出)

-INF 0XFF80000 負(fù)無窮(負(fù)溢出)

1.3 C-51 的擴(kuò)充定義

1.3.1 特殊功能寄存器的聲明

MSC-51

系列包括多種寄存器,其中一些具有特殊功能,如定時(shí)器,端口的控制寄存器等,為了能夠直接訪問這些寄存器,C51編譯器提供了一種定義的自主形式,這是必要的,因?yàn)檫@些定義與標(biāo)準(zhǔn)C語言是不兼容的。

為了支持這些特殊功能寄存器(SFR)的聲明,引入了關(guān)鍵詞“sfr”,語法如下:

sfr-dcl:sfr sfr_name=int_constant

例:

sfr p0=0x80;

sfr p1=0x90;

必須注意的是“sfr”后不是一個(gè)地址而是一個(gè)名字。因此上例中名字P0和P1(port0和port1)定義為特殊功能寄存器并被賦予相應(yīng)的絕對(duì)地址,名字可按意愿自由選取,源文件中不應(yīng)有先定義的sfr名字。

“=”號(hào)后的地址必須是常數(shù),不允許帶有運(yùn)算符的表達(dá)式,這個(gè)常數(shù)表達(dá)式必須在特殊功能寄存器的地址范圍內(nèi),位于0X80到0XFF之間。

8051系列寄存器數(shù)量和類型是極其不同的,因此建議將所有特別的“sfr”聲明放入一個(gè)頭文件,頭文件包括8051一些系列成員中的SFR定義。進(jìn)一步的定義可由用戶用一文件編輯器產(chǎn)生。

1.3.2

對(duì)SFR的16位數(shù)據(jù)訪問

在新的8051系列產(chǎn)品中,SFR在功能上經(jīng)常組合為16位的,為了有效的訪問這類SFR,使用定義“sfr16”,當(dāng)“SFR”的高端直接位于低端后時(shí),對(duì)SFR16位的訪問是可能的。例如8052的定時(shí)器2就是這種情況,16位聲明的語法與“sfr”相同,SFR低地址部分必須作為sfr16的地址:

例:sfr16 T2=0xCC

sfr16 RCAP2=0xCA

本例中,T2(由T2L和T2H組成)和RCAP2(由RCAP2L和RCAP2H組成)被定義為16位SFR,即使在這種情況下,聲明中的名字后仍不是賦值語句,而是一個(gè)SFR地址,高字節(jié)必須直接位于低字節(jié)之后,這種聲明適用于所有新的SFR,但不能用于Timer0和Timer1。

1.3.3

SBIT:特殊功能位聲明

在典型的8051應(yīng)用問題中,經(jīng)常需要單獨(dú)訪問SFR中的位,C51擴(kuò)充功能使之成為可能,特殊位,象SFR一樣,不與標(biāo)準(zhǔn)C語言兼容,使用保留字“sbit”可訪問位尋址對(duì)象。與SFR聲明一樣,用保留字“sbit”聲明某些特殊位接受符號(hào)名,“=”后語句將絕對(duì)值地址賦給變量名,這種地址分配有三種方法:

方法1:sfr_name^int_constant

當(dāng)字節(jié)是特殊功能寄存器的地址可用這個(gè)方法。sfr_name必須是已定義的SFR的名字,“^”后的語句定義了基地址上的特殊位的位置,該位置必須是一個(gè)0~7的數(shù)。

例: sfr PSW="0xD0";

sfr LE="0xA8";

sbit OV="PSW"^2;

sbit CY="PSW"^7;

方法2:int_constant^int_constant

這種方法以一整常數(shù)作基地址,該值必須在0x80~0xFF之間,并能被8整除,確定位的位置方法同上。

例: sbit OV="0xD0"^2;

sbit CV="0xD0"^7;

sbit EA="0xA8"^7;

方法3: int_constant

這種方法是將位的絕對(duì)地址賦給變量,地址必須位于0x80~0xFF之間。

例: sbit OV="0xD2";

sbit CY="0xD7";

sbit EA="0xAF";

特殊功能位代表了一個(gè)獨(dú)立的聲明類,它不能與其它聲明和位域互換。

1.3.4

BIT:位標(biāo)量聲明

除了通常的C數(shù)據(jù)類型外,C51編譯器支持“bit”數(shù)據(jù)類型,對(duì)此有下列擴(kuò)充與限制:

(1) 函數(shù)可包含類型為“bit”的參數(shù),也可將其作為返回值。

bit bfunc(bit b0,bit b1){

return(b1);

}

注:使用禁止中斷(#pragma disable)或包含明確的寄存器組切換(using

n)的函數(shù)不能返回位值,在這種情況下,編譯器會(huì)識(shí)別出來并產(chǎn)生一個(gè)錯(cuò)誤信息。

(2) 位標(biāo)量聲明的語法及C聲明的語義

static bit dirction_bit;

extern bit lock_printer_port;

bit display_invers;

(3) 對(duì)于位聲明的限制

l 位不能聲明為一個(gè)指針(bit *bit_poiter)

l 不存在位數(shù)組(bit b_array[5])

位聲明中允許定義存貯器類型,位都被放入一個(gè)位段,它總是在8051內(nèi)部RAM中,因此存貯器類型限制為DATA或IDATA,聲明為其它存貯器類型都將導(dǎo)致編譯出錯(cuò)。

1.3.5

可位尋址對(duì)象

可位尋址對(duì)象指可以字節(jié)或位尋址的對(duì)象,當(dāng)對(duì)象位于MSC-51可尋址RAM中時(shí)會(huì)有這種情況,C51允許帶“bdata”類型的對(duì)象放入可位尋址存貯器中。

bdata int ibase;

bdata char bary[4];

使用“sbit”聲明可獨(dú)立訪問可位尋址對(duì)象的位:

sbit mybit0=ibase^0;

sbit mybit15=ibase^15;

sbit ary07=bary[0]^7;

sbit ary37=bary[3]^7;

對(duì)象“ibase”和“bary”也可位尋址:

ary37=0;

ibase=-1;

mybit15=0;

sbit聲明要求基址對(duì)象的存貯器類型為“bdata”,否則只有絕對(duì)的位聲明方法是合法的。位位置(‘^’操作符號(hào)后)的最大值依賴于指定的基類型,這個(gè)值于char/uchar而言是0~7,對(duì)于int/uint/short/ushort而言是0~15,對(duì)于long/ulong而言是0~31。

在編譯器內(nèi)存貯器類型bdata與data一樣操作,并且只作與可再定位的sbit的運(yùn)算。注:可位尋址的的段長最大不能超過16字節(jié),可再定位的sbit聲明自動(dòng)轉(zhuǎn)為公共的(PBULIC)以使它們能被其它C模塊使用。

模塊1: sbit ary37=bary[3]^7;

模塊2: extern bit ary37;

sbit聲明也可為結(jié)構(gòu)和函數(shù)所用:

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類型所用,如果需要這樣做,浮點(diǎn)標(biāo)量必須與一個(gè)長整型標(biāo)量一起放入一個(gè)聯(lián)合中并且位位置必須由長整型標(biāo)題指定(見上例)。

總結(jié)

以上是生活随笔為你收集整理的C51语言支持哪些数据类型,C51编译器支持的数据类型(1)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: a片在线免费观看 | 欧美久久久一区二区三区 | 成人av男人的天堂 | 国产精品一区二区入口九绯色 | 色大师在线观看 | 无码人妻av一区二区三区波多野 | 5月婷婷6月丁香 | 日本一区二区免费电影 | 国产精品国产三级国产aⅴ原创 | 国产一级网站 | 成人欧美在线观看 | 国产三区在线视频 | 99久久人妻无码精品系列 | 第五色婷婷 | 午夜av大片 | 免费观看黄色网页 | 91激情影院 | 成人爽a毛片一区二区免费 日本高清免费看 | 日日躁夜夜躁白天躁晚上躁91 | 精品国产乱码久久久久久闺蜜 | 强乱中文字幕 | 99久久99久久精品国产片果冻 | 日韩一区二区三区精品 | 国产精品嫩草久久久久 | 狠狠狠 | 91高跟黑色丝袜呻吟在线观看 | 欧美日韩成人一区二区 | 久久久二区 | 国产成人精品一区二区 | 看av在线| 日韩在线视频网 | 欧美成人一区二区在线 | 亚洲国产精品一区二区尤物区 | 白峰美羽在线播放 | 一区二区三区不卡视频 | 自拍偷拍激情视频 | 伊人艹 | 欧美欧美欧美 | 91porny首页入口| 国产高清日韩 | 欧美日韩1 | 任你躁av一区二区三区 | 欧美成人三级在线观看 | 久久免费视频99 | 日本xxxxxⅹxxxx69 | 女人扒开腿让男人捅爽 | 亚洲人成色777777精品音频 | 成人性生交大免费看 | 上海女子图鉴 | 国产又粗又黄的视频 | 成年人看的黄色片 | 特黄aaaaaaaaa真人毛片 | 黄色小视频免费 | 五月丁香久久婷婷 | 亚洲男人天堂2023 | 免费不卡的av| 理论片中文字幕 | 欧美一级不卡 | 狠狠躁天天躁夜夜躁婷婷 | 成人激情四射网 | 激情五月婷婷综合网 | 做a爰小视频 | 亚洲精品在线观看网站 | 中文在线一区二区 | 农村妇女精品一区二区 | 一级在线看 | 加勒比在线免费视频 | 国产精品久久久久久久裸模 | 伊人视频在线观看 | 色婷婷丁香 | 国产又爽又黄的激情精品视频 | 欧美黑人一级 | 免费看黄网址 | 亚洲午夜无码久久久久 | 黄色大片视频网站 | 综合在线播放 | 一本色道久久综合亚洲二区三区 | 国产婷婷色一区二区三区 | 伊人88| 久久久精品人妻无码专区 | 伊人久久大香线蕉av一区 | 自拍偷拍福利视频 | 免费的黄色网址 | 香蕉视频网页版 | 日韩在线视频免费观看 | 婷婷伊人综合中文字幕 | 亚洲精品系列 | 久久人人艹 | 精品毛片一区二区三区 | 中文字幕av影片 | 丁香六月啪啪 | 成人小网站 | 深夜福利亚洲 | 日韩精品一区二区三区无码专区 | 一级黄色片免费在线观看 | 老司机午夜免费精品视频 | 天天干在线播放 | 国产精品一品二区三区的使用体验 | 一卡二卡在线视频 |