您的位置: 首頁 >游戲 >

如何用Keil來驗證單片機變量占多少字節(jié)

2022-07-10 08:00:30 編輯:別驊學 來源:
導讀 首先問大家兩個問題:8位單片機定義一個int型變量,占幾個字節(jié)?32位單片機定義一個char型變量,占幾個字節(jié)?我敢說很多人都不知道,或者存
首先問大家兩個問題:8位單片機定義一個int型變量,占幾個字節(jié)?32位單片機定義一個char型變量,占幾個字節(jié)?我敢說很多人都不知道,或者存在疑惑。具體占多少字節(jié),其實通過手動驗證一下就知道了。今天結合Keil C51(AT89C51),以及Keil MDK(STM32)為大家驗證一下 char、short、int、float、double 到底占幾字節(jié)空間。

Keil C51、8位單片機

這一節(jié)基于Keil C51工具,8位單片機(AT89C51)進行測試。
//char a;void main(void){  while(1)  {  }}
這是一個很簡單的Demo,只針對變量占用空間大小進行測試,主要是對比data的大小,初始值為9。(其中系統(tǒng)【啟動文件】占用了9字節(jié)RAM空間)1.char占1字節(jié)

定義變量:

char a;

編譯結果:

Program Size: data=10.0 xdata=0 code=17
2.short占2字節(jié)

定義變量:

short a;

編譯結果:

Program Size: data=11.0 xdata=0 code=17
3.int占2字節(jié)

定義變量:

int a;

編譯結果:

Program Size: data=11.0 xdata=0 code=17
4.float占4字節(jié)

定義變量:

float a

編譯結果:

Program Size: data=13.0 xdata=0 code=17
5.double占4字節(jié)

定義變量:

double

編譯結果:

Program Size: data=13.0 xdata=0 code=17

Keil MDK、32位單片機

這一節(jié)基于Keil MDK工具,32位單片機(STM32)進行測試。
//char a;int main(void){  while(1)  {//    a++;  }}
這也是一個很簡單的Demo,主要是對比RW-data的大小,初始值為0。(其中 ZI-data=1024 為系統(tǒng)分配的??臻g大?。?.char占1字節(jié)

定義變量:

char a;

編譯結果:

Program Size: Code=512 RO-data=436 RW-data=4 ZI-data=1028
啥?占了4個字節(jié)?答案:只占了一個字節(jié),因為32位機是4字節(jié)為一個“單元”,一個 char 只占用了其中1字節(jié)(類似結構體占用空間大小,這里還牽涉到大小端對齊模式)。再舉一個例子:定義4個 char型變量,還是占用4字節(jié)空間(short原理一樣)再次提示:

注意4字節(jié)為一個“單元”,超過這個單元就分配到“下一個單元”,比如:

char a;int b;char c;

這里就會占用12(3 * 4)字節(jié)空間(a、b、c各自占4字節(jié))。

2.short占2字節(jié)

定義變量:

short a;

編譯結果:

ProgramSize:Code=512RO-data=436RW-data=4ZI-data=1028
這里和 char 類似,如果定義兩個 short 也是占用4個字節(jié)。3.int占4字節(jié)

定義變量:

int a;

編譯結果:

ProgramSize:Code=512RO-data=436RW-data=4ZI-data=1028
32位機,int占用4字節(jié)沒什么說的。4.float占4字節(jié)

定義變量:

float a;

編譯結果:

ProgramSize:Code=520RO-data=436RW-data=4ZI-data=1028
5.double占8字節(jié)

定義變量:

double a;

編譯結果:

ProgramSize:Code=1156RO-data=436RW-data=8ZI-data=1024

總結

上面驗證情況在Keil C51、 8位單片機(AT89C51)中:

char:占1字節(jié)

short、int:占2字節(jié)

float、double:占4字節(jié)

在Keil MDK、 32位單片機(STM32)中:

char:占1字節(jié)

short:占2字節(jié)

int、float:占4字節(jié)

double:占8字節(jié)

通過對比上面幾個變量,以及編譯結果,得出一些結論。1.變量占多少字節(jié),與處理器(以及編譯器)有關;2.浮點數(shù)運算更占代碼空間,且double比float更占空間。上面基于32位機中進行了a++;運算,明顯float、double打碼量(code)更大。3.變量數(shù)據(jù)對齊規(guī)則和結構體一樣。經典的面試題:計算下面結構體占用多少字節(jié)?
struct Str{  char a;  short b;  int c;  char d;};
這里面還有很多細節(jié)內容,可能很多人都沒有深入研究過,感興趣的朋友可以自己實驗研究一下。

免責聲明:本文由用戶上傳,如有侵權請聯(lián)系刪除!

2016-2022 All Rights Reserved.平安財經網.復制必究 聯(lián)系QQ280 715 8082   備案號:閩ICP備19027007號-6

本站除標明“本站原創(chuàng)”外所有信息均轉載自互聯(lián)網 版權歸原作者所有。