C語言進階幾分鐘帶你理解大小端存儲模式
正片開始
C語言中數(shù)據(jù)類型的存儲是較為嚴謹?shù)?,一塊空間只能存儲一種數(shù)據(jù)類型,要知道內(nèi)存這個東西,在早期可是非常珍貴的。
尤其對于那些性能不好計算機更是如此,比如 Office1997,操作系統(tǒng)為Windows95 ,奔騰1的cpu,內(nèi)存只有128M。就這么綠豆點大的存儲空間,要想達到節(jié)約,利用最大化就必須在同一塊空間中存入不同類型數(shù)據(jù)。
所以共用體的概念就隨之產(chǎn)生,將幾種不同類型的內(nèi)容覆蓋到同一內(nèi)存單元,之前在我的一篇共用體專題寫過,但感覺自己總結(jié)的還不夠到位,這里再講講。
共用體原理
共用體和結(jié)構(gòu)體非常相似,共用體定義很簡單,只需要 union + 共用體名即可,舉個栗子:
union student: { char name; short age; int weight; char sex; };
某種意義上,共用體與結(jié)構(gòu)體是差不多的數(shù)據(jù)結(jié)構(gòu),他們都可以同時包含多種數(shù)據(jù)類型。
但是!畢竟不叫同一個名兒就不是同一個玩意兒,那他們==本質(zhì)上的區(qū)別是啥?==這里我先從內(nèi)存方面下手,對于結(jié)構(gòu)體,在內(nèi)存中,他們有各自的存儲空間,不管這個這個成員我有沒有去使用他,C語言程序都會給他分配空間, 所以有結(jié)構(gòu)體類型長度大于或等于各成員長度之和一說。
而在共用體中,各成員在一坨空間里面,空間相當于是共享的的公共空間,一個共用體類型長度等于所有成員變量中最寬數(shù)據(jù)的長度,比如我剛剛的student 這個共用體中 ,有 char,short和 int 類型,此時該共用體類型長度就是4個字節(jié),也就是 int 類型長度。強調(diào)一下,這里的共享并不是把多個變量同時放入一個共用體內(nèi),是指該共用體可被賦予任何一種變量的值,但每次賦值只能賦一種,多種還是會遵循共用體最長數(shù)據(jù)覆蓋原則,也就是說共用體在同一時間只能存放一個變量。
引申一下
為了去確定當前計算機的存儲模式,我們可以用共用體去試觸,判斷它是大端存儲還是小端存儲,這樣簡單又高效。
我們都知道計算機內(nèi)存是以字節(jié)為單位的劃分的,每個地址單元對應(yīng)一個字節(jié),一個字節(jié)占 8 個 bit 位,一個 bit 對應(yīng)存儲一個二進制數(shù)據(jù),比如 00000000;
另外還有 int ,long ,long long,在16位和32位處理器中,可同時處理16 bit 和32 bit 的數(shù)據(jù),寄存器寬度都大于一個字節(jié),就此我們的大小端存儲模式應(yīng)運而生。
字節(jié)順序
在搞清楚大小端模式之前必須搞清楚字節(jié)的順序,在兩個設(shè)備之間進行數(shù)據(jù)的傳輸時,我要把一個東西從A傳到B,但這時發(fā)現(xiàn)在A設(shè)備中,內(nèi)容是正序的,但是B設(shè)備中的內(nèi)容是反序放著的,我們就無法在傳輸后得到正確的格式,所以就要要求統(tǒng)一的模式。
大小端存儲
大端存儲是指數(shù)據(jù)的低位字節(jié)順序會存儲在內(nèi)存的高地址中,小端存儲模式則恰恰相反,比如我將一個十六進制數(shù) 0x1234ffff,對應(yīng)字節(jié)序由低到高從 f 到 1 ,從右向左依次讀取較低位字節(jié)放在地址較大的內(nèi)存單元中,如下:
小端存儲則會從右向左依次讀取較低位的字節(jié)存入地址較小的內(nèi)存單元中。
我們常用的X86結(jié)構(gòu),ARM就是小端模式,什么 C51則為大端模式(沒學我也不知道是個啥,但還是擺出來)。
共用體判斷大小端
union num { int a; char b[2]; };
比如我定義一個num共用體類型,再創(chuàng)建一個共用體變量 union num i,這時內(nèi)存中會劃分出四個字節(jié)的大小用于存放 num1;假設(shè)i的char類型 i.b = 0x1234,雖然這時我num1中的char類型沒有被賦值,但已經(jīng)被我的 int 類型所覆蓋, 我們int 類型四個字節(jié)對應(yīng)四個空間,char類型只需一個空間,我們只需要觀察int的值是否在char空間中高位存放了低位字節(jié),是則為大端存儲,反之則為小端存儲,可用代碼打印如下:
printf("i.a = %x\n",i.a); printf("i.b[0] = %x\n",i.b[0]); printf("i.b[1] = %x\n",i.b[1]);
效果如圖:
可以看出我的電腦就是小端存儲滴。
今天就到這里吧,摸了家人們,更多關(guān)于C語言進階大小端模式的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
c語言中十進制轉(zhuǎn)二進制顯示小工具的實現(xiàn)代碼
本篇文章是對c語言中十進制轉(zhuǎn)二進制顯示小工具的實現(xiàn)代碼進行了詳細的分析的介紹,需要的朋友參考下2013-05-05c++ TCHAR轉(zhuǎn)string導致中文缺失或亂碼問題及解決
這篇文章主要介紹了c++ TCHAR轉(zhuǎn)string導致中文缺失或亂碼問題及解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-08-08