新聞中心

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

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

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

這個(gè)不就是表示3了嗎?也就是說,如果你要放這個(gè)數(shù),我把這個(gè)數(shù)先轉(zhuǎn)成二進(jìn)制形式(可以直接使用電腦自帶的計(jì)算機(jī)來轉(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位).也就是說,即便你只想放一個(gè)數(shù)字1,單片機(jī)也會(huì)給你8個(gè)格子。這里我們可以這樣來理解存儲(chǔ)器:

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

每一行8個(gè)單元格,每個(gè)單元格能放0或者1.ROM由很多個(gè)這樣的單元格組成。具體的我們后面再講。于是這樣我們存放3,30,40,120等等就容易了,都是放在同一行的單元格中。這樣每一行能存放的大小范圍為0-255.也就是說在0-255直接任意大小的數(shù)據(jù)都很好存儲(chǔ)了。像這樣的數(shù)據(jù)我們就叫char型。但是又有了個(gè)問題,如果我要存放-3這個(gè)負(fù)數(shù),怎么辦?我們說過這些單元格只能放1或者0,不能放負(fù)號(hào)進(jìn)去,怎么辦?于是我們想了個(gè)辦法,就從8個(gè)單元格中取一個(gè)出來,用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ù)。

好了,問題來了。如何我現(xiàn)在要存放256怎么辦?8個(gè)單元格肯定不夠用了,需要9個(gè)單元格,前面說了,要么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ī)).那么有沒有24個(gè)單元格呢?沒有,只有32個(gè)格子,這個(gè)是固定的。32格子就是長整型了,用long表示。同樣的,可以知道,

unsignedlong 范圍:0 – 4294967295,

signedlong 范圍:-2147483648 – 2147483647

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

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

1. 無參宏定義

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

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

例如:

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

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

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

2. 類型定義符typedef

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

#include "reg52.h"

#define uchar unsigned char //注意后面沒有分號(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ù)專區(qū)

關(guān)閉