<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

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

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

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

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

本文引用地址:http://dyxdggzs.com/article/201611/319550.htm

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

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

unsignedchar 表示最高位為數字,signed char表示最高位為正負。

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

如果是unsigned int,則表示65367

如果是signed int,表示-32599

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

signedint的范圍: -32768 – 32767

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

unsignedlong 范圍:0 – 4294967295,

signedlong 范圍:-2147483648 – 2147483647

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

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

1. 無(wú)參宏定義

#define 標志符 字符串

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

例如:

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

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

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

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

C語(yǔ)言不僅提供了豐富的數據類(lèi)型,而且還允許由用戶(hù)自己定義類(lèi)型說(shuō)明符,也就是說(shuō)允許由用戶(hù)為數據類(lèi)型取"別名"。類(lèi)型定義符typedef即可用來(lái)完成此功能。typedef定義的一般形式為:typedef 原類(lèi)型名 新類(lèi)型名例如 typedef char NAME[20];表示Name是字符數組類(lèi)型,數組長(cháng)度為20,注意后面帶有分號。然后可以用NAME說(shuō)明變量,如:NAME a1, a2, s1,s2;完全等效于:char a1[20], a2[20],s1[20],s2[20]宏定義define與類(lèi)型說(shuō)明符typedef的區別在單片機編程中我們經(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í)就可以看出它們的區別:PIN1 a, b;在宏代換后變成:int *a,b;表示a是指向整形的指針變量,而b是整型變量。然而:PIN2 a,b;表示a,b都是指向整型的指針變量。因為PIN2是一個(gè)類(lèi)型說(shuō)明符。由這個(gè)例子可見(jiàn),宏定義雖然也可表示數據類(lèi)型,但畢竟是作為字符代換。在使用時(shí)要非常小心,以避免出錯。以上我們概述了數據類(lèi)型,現在我們各舉一個(gè)例子說(shuō)明,例1 比較unsigned char; unsigned int; unsigned long 占用存儲空間的大小運行程序之前需要設置keil優(yōu)化等級,將優(yōu)化等級設置為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);

}

//輸出結果信息 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è)數據0x30, 使用不同的數據類(lèi)型定義,將占據不同的存儲空間例2 define的使用

#include "reg52.h"

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

sbit LED0=P1^3;

void main(void)

{

uchar i;

i=0x30;

LED0=i;

while(1);

}

例3 typedef的使用

#include "reg52.h"

typedef unsigned char uchar;//注意后面有分號

sbit LED0=P1^3;

void main(void)

{

uchar i;

i=0x30;

LED0=i;

while(1);

}



評論


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

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>