新聞中心

EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 51單片機(jī)之C語(yǔ)言-4.1數(shù)據(jù)類(lèi)型

51單片機(jī)之C語(yǔ)言-4.1數(shù)據(jù)類(lèi)型

作者: 時(shí)間:2016-11-21 來(lái)源:網(wǎng)絡(luò) 收藏
從這一章起我們開(kāi)始學(xué)習(xí)單片機(jī)C語(yǔ)言,既然是語(yǔ)言那么就應(yīng)該有基本詞匯和相關(guān)的語(yǔ)法。我們先來(lái)看看數(shù)據(jù)類(lèi)型。講數(shù)據(jù)之前先簡(jiǎn)單說(shuō)說(shuō)單片機(jī)的存儲(chǔ)結(jié)構(gòu)。我們知道單片機(jī)要運(yùn)行之前,我們需要給他寫(xiě)指令,指令存放在ROM存儲(chǔ)器上。我們?cè)偌?xì)想一下,既然存放在ROM上,那么我們來(lái)想一個(gè)問(wèn)題,比如我的指令中有個(gè)數(shù)字‘3’要,這個(gè)‘3’是怎么存放的?相信這個(gè)很容易,單片機(jī)中存放的都是二進(jìn)制,那么首先要轉(zhuǎn)成二進(jìn)制11B,格式如下:

這個(gè)不就是表示3了嗎?也就是說(shuō),如果你要放這個(gè)數(shù),我把這個(gè)數(shù)先轉(zhuǎn)成二進(jìn)制形式(可以直接使用電腦自帶的計(jì)算機(jī)來(lái)轉(zhuǎn)換),然后找單片機(jī)的存儲(chǔ)器要2個(gè)格子放進(jìn)去1或者0就行了。這樣理解對(duì)不對(duì)呢?不對(duì)。你向單片機(jī)要格子的時(shí)候,單片機(jī)要么給你8個(gè)格子,要么16個(gè),也就是8整數(shù)倍。為什么是這樣?因?yàn)閱纹瑱C(jī)存儲(chǔ)器的最小單元是一個(gè)字節(jié)(8位).也就是說(shuō),即便你只想放一個(gè)數(shù)字1,單片機(jī)也會(huì)給你8個(gè)格子。這里我們可以這樣來(lái)理解存儲(chǔ)器:

本文引用地址:http://m.butianyuan.cn/article/201611/319550.htm

每一行8個(gè)單元格,每個(gè)單元格能放0或者1.ROM由很多個(gè)這樣的單元格組成。具體的我們后面再講。于是這樣我們存放3,30,40,120等等就容易了,都是放在同一行的單元格中。這樣每一行能存放的大小范圍為0-255.也就是說(shuō)在0-255直接任意大小的數(shù)據(jù)都很好存儲(chǔ)了。像這樣的數(shù)據(jù)我們就叫char型。但是又有了個(gè)問(wèn)題,如果我要存放-3這個(gè)負(fù)數(shù),怎么辦?我們說(shuō)過(guò)這些單元格只能放1或者0,不能放負(fù)號(hào)進(jìn)去,怎么辦?于是我們想了個(gè)辦法,就從8個(gè)單元格中取一個(gè)出來(lái),用0表示正,1表示負(fù)。取哪一個(gè)單元格,最高位也就是最左邊的那個(gè)為最高位。假如我現(xiàn)在在最高位放一個(gè)1,那么單片機(jī)怎么知道這個(gè)最高位是1還是表示負(fù)數(shù),比如:

1111_0110這個(gè)是多少,246還是-118,怎么區(qū)別?看看我們是怎么告訴單片機(jī)的,

unsignedchar 表示最高位為數(shù)字,signed char表示最高位為正負(fù)。

好了,問(wèn)題來(lái)了。如何我現(xiàn)在要存放256怎么辦?8個(gè)單元格肯定不夠用了,需要9個(gè)單元格,前面說(shuō)了,要么8個(gè)單元格,要么16個(gè)單元格,單片機(jī)不給你9個(gè)單元格,這樣我們只好用16個(gè)單元格,即使只用了9個(gè)單元格,有點(diǎn)浪費(fèi). 這16個(gè)格子就表示int整型。同樣的,正負(fù)也是占用最高位的一個(gè)格子,unsigned int 表示最高位的單元格是數(shù)字,signed int最高單元格表示正負(fù)。舉個(gè)例子:65367

如果是unsigned int,則表示65367

如果是signed int,表示-32599

很容易的可以算出,unsigned int的范圍:0-65535

signedint的范圍: -32768 – 32767

現(xiàn)在我們知道了8個(gè)單元格就是char,16單元格就是int(范圍限于本單片機(jī)).那么有沒(méi)有24個(gè)單元格呢?沒(méi)有,只有32個(gè)格子,這個(gè)是固定的。32格子就是長(zhǎng)整型了,用long表示。同樣的,可以知道,

unsignedlong 范圍:0 – 4294967295,

signedlong 范圍:-2147483648 – 2147483647

通過(guò)以上的分析,我們可以知道,如果要使用的數(shù)據(jù)只需要占用8個(gè)格子,就沒(méi)有必要占用16個(gè)格子,這樣可以節(jié)省存儲(chǔ)空間。

另外這里補(bǔ)充兩個(gè)程序中經(jīng)常用到的兩個(gè)指令 define和typedef

1. 無(wú)參宏定義

#define 標(biāo)志符 字符串

其中的"#"表示這是一條預(yù)處理命令。凡是以"#"開(kāi)頭的均為預(yù)處理命令。"標(biāo)志符"為所定義的宏名。"字符串"可以是常數(shù),表達(dá)式,格式串等。

例如:

#define M (y*y+3*y)

它的作用是指定標(biāo)志符M來(lái)代替表達(dá)式(y*y+3*y). 在編寫(xiě)源程序時(shí),所有的(y*y+3*y)都可由M代替。

注意#define M(y*y+3*y)后面不可以有分號(hào)";",否則M將分號(hào)一起替換

2. 類(lèi)型定義符typedef

C語(yǔ)言不僅提供了豐富的數(shù)據(jù)類(lèi)型,而且還允許由用戶(hù)自己定義類(lèi)型說(shuō)明符,也就是說(shuō)允許由用戶(hù)為數(shù)據(jù)類(lèi)型取"別名"。類(lèi)型定義符typedef即可用來(lái)完成此功能。typedef定義的一般形式為:typedef 原類(lèi)型名 新類(lèi)型名例如 typedef char NAME[20];表示Name是字符數(shù)組類(lèi)型,數(shù)組長(zhǎng)度為20,注意后面帶有分號(hào)。然后可以用NAME說(shuō)明變量,如:NAME a1, a2, s1,s2;完全等效于:char a1[20], a2[20],s1[20],s2[20]宏定義define與類(lèi)型說(shuō)明符typedef的區(qū)別在單片機(jī)編程中我們經(jīng)??吹?#define uchar unsigned char#define uint unsigned int也可以使用typedef來(lái)定義:typtedef unsigned char uchar;typedef unsigned int uint;但是碰到如下情況就不能互換了,#define PIN1 int *typedef (int *) PIN2;從形式上看這兩者相似,但在實(shí)際使用中卻不相同。下面用PIN1,PIN2說(shuō)明變量時(shí)就可以看出它們的區(qū)別:PIN1 a, b;在宏代換后變成:int *a,b;表示a是指向整形的指針變量,而b是整型變量。然而:PIN2 a,b;表示a,b都是指向整型的指針變量。因?yàn)镻IN2是一個(gè)類(lèi)型說(shuō)明符。由這個(gè)例子可見(jiàn),宏定義雖然也可表示數(shù)據(jù)類(lèi)型,但畢竟是作為字符代換。在使用時(shí)要非常小心,以避免出錯(cuò)。以上我們概述了數(shù)據(jù)類(lèi)型,現(xiàn)在我們各舉一個(gè)例子說(shuō)明,例1 比較unsigned char; unsigned int; unsigned long 占用存儲(chǔ)空間的大小運(yùn)行程序之前需要設(shè)置keil優(yōu)化等級(jí),將優(yōu)化等級(jí)設(shè)置為0過(guò)程如下:在keil界面-> project->Options for target target 1...點(diǎn)擊C51,選擇Level為0

代碼如下:

#include "reg52.h"

sbit LED0=P1^3;

void main(void)

{

unsigned char i;

i=0x30;

LED0=i;

while(1);

}

//輸出結(jié)果信息 Program Size: data=10.0 xdata=0 code=27

#include "reg52.h"

sbit LED0=P1^3;

void main(void)

{

unsigned int i;

i=0x30;

LED0=i;

while(1);

}

//Program Size: data=11.0 xdata=0 code=32

#include "reg52.h"

sbit LED0=P1^3;

void main(void)

{

unsigned long i;

i=0x30;

LED0=i;

while(1);

}

//Program Size: data=13.0 xdata=0 code=46

//unsigned char: Program Size: data=10.0 xdata=0 code=27//unsigned int: Program Size: data=11.0 xdata=0 code=32//unsigned long:Program Size: data=13.0 xdata=0 code=46可見(jiàn)同樣一個(gè)數(shù)據(jù)0x30, 使用不同的數(shù)據(jù)類(lèi)型定義,將占據(jù)不同的存儲(chǔ)空間例2 define的使用

#include "reg52.h"

#define uchar unsigned char //注意后面沒(méi)有分號(hào)

sbit LED0=P1^3;

void main(void)

{

uchar i;

i=0x30;

LED0=i;

while(1);

}

例3 typedef的使用

#include "reg52.h"

typedef unsigned char uchar;//注意后面有分號(hào)

sbit LED0=P1^3;

void main(void)

{

uchar i;

i=0x30;

LED0=i;

while(1);

}



評(píng)論


技術(shù)專(zhuān)區(qū)

關(guān)閉