最近看到群友在討論【單片機(jī)變量存儲大小由什么決定?】的話題。
比如:int、long int 有多大?結(jié)構(gòu)體占多大空間?
描述
在實際情況中,不同的處理器架構(gòu)、操作系統(tǒng)、以及編譯器等都不是決定整形變量大小的關(guān)鍵因素,比如:51、ARM、x86、x64等不同的處理器架構(gòu),FreeRTOS、 Linux、Windows等不同的操作系統(tǒng),gcc、AC、clang等不同編譯器。
主要是處理器位數(shù)決定。(當(dāng)然,目前我驗證過的所有情況是由處理器位數(shù)決定,其他決定性因素有待考證)
首先,整型變量大小由編譯器(編譯)得來,而編譯器首先會考慮編譯環(huán)境(這個環(huán)境主要是CPU的位數(shù))。
之前給大家分享過《用Keil驗證8位和32位單片機(jī)變量占用空間大小》,其中就體現(xiàn)了8位和32位CPU中變量占用空間的大小。
驗證
之前分享《用Keil驗證8位和32位單片機(jī)變量占用空間大小》的內(nèi)容,主要在Keil這個編譯環(huán)境下,通過編譯大小驗證。
這其中是想描述Keil環(huán)境下CPU位數(shù),以及大小端對變量占用空間大小的影響。
而最直接的辦法則是通過sizeof得出大小,打印出來。 這里額外提一下sizeof 和 sizeof 的區(qū)別:
sizeof通常計算變量大小,strlen計算字符串長度
sizeof是運算操作符,strlen是函數(shù)
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; }
大家可以試著用不同的編譯環(huán)境試試上面這部分代碼,看看有什么差別。
這里簡單舉例兩個:
1.Keil MDK編譯,直接下載在STM32中串口打印輸出。
串口輸出結(jié)果:
char: 1 short int: 2 int: 4 long int: 4 long long int: 8 float: 4 double: 8
2.在線編譯器 這里我用的在線編譯器,網(wǎng)址: https://rextester.com/l/c_online_compiler_gcc (復(fù)制到瀏覽器直接打開即可) gcc編譯:
clang編譯:
以及其他環(huán)境,輸出情況都一樣,因為是在同一臺電腦(操作系統(tǒng)、CPU位數(shù)都一樣)。
char: 1 short int: 2 int: 4 long int: 8 long long int: 8 float: 4 double: 8如果你換到平臺,可能結(jié)果就不一樣了。通過對比各種結(jié)果,你自然會得出結(jié)論。
審核編輯:湯梓紅
-
處理器
+關(guān)注
關(guān)注
68文章
19259瀏覽量
229649 -
單片機(jī)
+關(guān)注
關(guān)注
6035文章
44554瀏覽量
634618 -
keil
+關(guān)注
關(guān)注
68文章
1212瀏覽量
166839 -
編譯器
+關(guān)注
關(guān)注
1文章
1623瀏覽量
49108
原文標(biāo)題:單片機(jī)變量存儲大小由什么決定?
文章出處:【微信號:strongerHuang,微信公眾號:strongerHuang】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論