51單片機(jī)之C語(yǔ)言-4.1數(shù)據(jù)類型
這個(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. 類型定義符typedef
C語(yǔ)言不僅提供了豐富的數(shù)據(jù)類型,而且還允許由用戶自己定義類型說(shuō)明符,也就是說(shuō)允許由用戶為數(shù)據(jù)類型取"別名"。類型定義符typedef即可用來(lái)完成此功能。typedef定義的一般形式為:typedef 原類型名 新類型名例如 typedef char NAME[20];表示Name是字符數(shù)組類型,數(shù)組長(zhǎng)度為20,注意后面帶有分號(hào)。然后可以用NAME說(shuō)明變量,如:NAME a1, a2, s1,s2;完全等效于:char a1[20], a2[20],s1[20],s2[20]宏定義define與類型說(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è)類型說(shuō)明符。由這個(gè)例子可見(jiàn),宏定義雖然也可表示數(shù)據(jù)類型,但畢竟是作為字符代換。在使用時(shí)要非常小心,以避免出錯(cuò)。以上我們概述了數(shù)據(jù)類型,現(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ù)類型定義,將占據(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)論