最近看到群友在討論【單片機變量存儲大小由什么決定?】的話題。
比如:int、long int 有多大?結構體占多大空間?
描述
在實際情況中,不同的處理器架構、操作系統、以及編譯器等都不是決定整形變量大小的關鍵因素,比如:51、ARM、x86、x64等不同的處理器架構,FreeRTOS、 Linux、Windows等不同的操作系統,gcc、AC、clang等不同編譯器。
主要是處理器位數決定。(當然,目前我驗證過的所有情況是由處理器位數決定,其他決定性因素有待考證)
首先,整型變量大小由編譯器(編譯)得來,而編譯器首先會考慮編譯環境(這個環境主要是CPU的位數)。
之前給大家分享過《用Keil驗證8位和32位單片機變量占用空間大小》,其中就體現了8位和32位CPU中變量占用空間的大小。
驗證
之前分享《用Keil驗證8位和32位單片機變量占用空間大小》的內容,主要在Keil這個編譯環境下,通過編譯大小驗證。
這其中是想描述Keil環境下CPU位數,以及大小端對變量占用空間大小的影響。
而最直接的辦法則是通過sizeof得出大小,打印出來。 這里額外提一下sizeof 和 sizeof 的區別:
sizeof通常計算變量大小,strlen計算字符串長度
sizeof是運算操作符,strlen是函數
sizeof在編譯的時候得出大小,strlen要考慮’\0字符的長度
例子源代碼:
#includeintmain(void) { printf( " char: %d " , sizeof(char)); printf( " short int: %d " , sizeof(short int)); printf( " int: %zd " , sizeof(int)); printf( " long int: %d ", sizeof(long int)); printf( "long long int: %d ", sizeof(long long int)); printf( " float: %d ", sizeof(float)); printf( " double: %d ", sizeof(double)); return 0; }
大家可以試著用不同的編譯環境試試上面這部分代碼,看看有什么差別。
這里簡單舉例兩個:
1.Keil MDK編譯,直接下載在STM32中串口打印輸出。
串口輸出結果:
char: 1 short int: 2 int: 4 long int: 4 long long int: 8 float: 4 double: 8
2.在線編譯器 這里我用的在線編譯器,網址: https://rextester.com/l/c_online_compiler_gcc (復制到瀏覽器直接打開即可) gcc編譯:
clang編譯:
以及其他環境,輸出情況都一樣,因為是在同一臺電腦(操作系統、CPU位數都一樣)。
char: 1 short int: 2 int: 4 long int: 8 long long int: 8 float: 4 double: 8如果你換到平臺,可能結果就不一樣了。通過對比各種結果,你自然會得出結論。
審核編輯:湯梓紅
-
處理器
+關注
關注
68文章
19178瀏覽量
229200 -
單片機
+關注
關注
6032文章
44525瀏覽量
633243 -
keil
+關注
關注
68文章
1212瀏覽量
166701 -
編譯器
+關注
關注
1文章
1618瀏覽量
49057
原文標題:單片機變量存儲大小由什么決定?
文章出處:【微信號:strongerHuang,微信公眾號:strongerHuang】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論