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