有人說單片機(jī)開發(fā)很簡單,也有人說很難。
其實(shí),不同階段的人有不同的見解,同樣的單片機(jī),你開發(fā)一些簡單的應(yīng)用自然很簡單。當(dāng)項(xiàng)目做大,就要用到各種“技術(shù)”,比如優(yōu)化代碼,變量占用空間等問題。
接下來就結(jié)合Keil C51(AT89C51),以及Keil MDK(STM32)為大家驗(yàn)證一下?char、short、int、float、double 到底占幾字節(jié)空間。
Keil C51、8位單片機(jī)
這一節(jié)基于Keil C51工具,8位單片機(jī)(AT89C51)進(jìn)行測試。

?
//char a;
?
void main(void){ ?while(1) ?{ ?}} 這是一個(gè)很簡單的Demo,只針對變量占用空間大小進(jìn)行測試,主要是對比?data?的大小,初始值為9。(其中系統(tǒng)【啟動(dòng)文件】占用了9字節(jié)RAM空間)
1.char占1字節(jié)
定義變量:
?
char a;
?
編譯結(jié)果:
?
Program Size: data=10.0 xdata=0 code=17
?

? 2.short占2字節(jié)
定義變量:
?
short a;
?
編譯結(jié)果:
?
Program Size: data=11.0 xdata=0 code=17
?
3.int占2字節(jié)
定義變量:
?
int a;
?
編譯結(jié)果:
?
Program Size: data=11.0 xdata=0 code=17
?

? 4.float占4字節(jié)
定義變量:
?
float a
?
編譯結(jié)果:
?
Program Size: data=13.0 xdata=0 code=17
?

? 5.double占4字節(jié)
定義變量:
?
double
?
編譯結(jié)果:
?
Program Size: data=13.0 xdata=0 code=17?
?
Keil MDK、32位單片機(jī)
這一節(jié)基于Keil MDK工具,32位單片機(jī)(STM32)進(jìn)行測試。 ?

?
//char a;
?
int main(void){ ?while(1) ?{// ? ?a++; ?}} 這也是一個(gè)很簡單的Demo,主要是對比?RW-data?的大小,初始值為0。(其中 ZI-data=1024 為系統(tǒng)分配的??臻g大?。??
1.char占1字節(jié)
定義變量:
?
char a;
?
編譯結(jié)果:
?
Program Size: Code=512 RO-data=436 RW-data=4 ZI-data=1028
?

? 啥?占了4個(gè)字節(jié)? ?
答案:只占了一個(gè)字節(jié),因?yàn)?2位機(jī)是4字節(jié)為一個(gè)“單元”,一個(gè) char 只占用了其中1字節(jié)(類似結(jié)構(gòu)體占用空間大小,這里還牽涉到大小端對齊模式)。 ?
再舉一個(gè)例子:定義4個(gè) char?型變量,還是占用4字節(jié)空間(short原理一樣)。

? 再次提示:
注意4字節(jié)為一個(gè)“單元”,超過這個(gè)單元就分配到“下一個(gè)單元”,比如:
?
char a;int b;char c;
?
這里就會(huì)占用12(3 * 4)字節(jié)空間(a、b、c各自占4字節(jié))。
? 2.short占2字節(jié)
定義變量:
?
short a;
?
編譯結(jié)果:
?
Program Size:?Code=512 RO-data=436 RW-data=4 ZI-data=1028
?
這里和 char 類似,如果定義兩個(gè) short 也是占用4個(gè)字節(jié)。 ?
? 3.int占4字節(jié)
定義變量:
?
int a;
?
編譯結(jié)果:
?
Program Size:?Code=512 RO-data=436 RW-data=4 ZI-data=1028
?
32位機(jī),int占用4字節(jié)沒什么說的。
4.float占4字節(jié)
定義變量:
?
float a;
?
編譯結(jié)果:
?
Program Size:?Code=520?RO-data=436?RW-data=4?ZI-data=1028
?

5.double占8字節(jié)
定義變量:
?
double a;
?
編譯結(jié)果:
?
Program Size:?Code=1156?RO-data=436?RW-data=8?ZI-data=1024
?
總結(jié)
上面驗(yàn)證情況 在Keil C51、 8位單片機(jī)(AT89C51)中:
char:占1字節(jié)
short、int:占2字節(jié)
float、double:占4字節(jié)
? 在Keil MDK、 32位單片機(jī)(STM32)中:
char:占1字節(jié)
short:占2字節(jié)
int、float:占4字節(jié)
double:占8字節(jié)
? 通過對比上面幾個(gè)變量,以及編譯結(jié)果,得出一些結(jié)論。
1.變量占多少字節(jié),與處理器(以及編譯器)有關(guān);
2.浮點(diǎn)數(shù)運(yùn)算更占代碼空間,且double比float更占空間。 上面基于32位機(jī)中進(jìn)行了?a++;?運(yùn)算,明顯float、double打碼量(code)更大。
3.變量數(shù)據(jù)對齊規(guī)則和結(jié)構(gòu)體一樣。 經(jīng)典的面試題:計(jì)算下面結(jié)構(gòu)體占用多少字節(jié)? ?
?
struct Str{ ?char a; ?short b; ?int c; ?char d;};
審核編輯:劉清
?
電子發(fā)燒友App
















評論