欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C語言進(jìn)階幾分鐘帶你理解大小端存儲(chǔ)模式

 更新時(shí)間:2022年02月16日 08:46:53   作者:?jiǎn)虇碳业凝堼? 
這篇文章主要為大家介紹了C語言進(jìn)階大小端模式的示例詳解,帶各位讀者朋友五分鐘腳踩大小端模式,有需要的朋友可以借鑒參考下,希望能夠有所幫助

正片開始

C語言中數(shù)據(jù)類型的存儲(chǔ)是較為嚴(yán)謹(jǐn)?shù)模粔K空間只能存儲(chǔ)一種數(shù)據(jù)類型,要知道內(nèi)存這個(gè)東西,在早期可是非常珍貴的。

尤其對(duì)于那些性能不好計(jì)算機(jī)更是如此,比如 Office1997,操作系統(tǒng)為Windows95 ,奔騰1的cpu,內(nèi)存只有128M。就這么綠豆點(diǎn)大的存儲(chǔ)空間,要想達(dá)到節(jié)約,利用最大化就必須在同一塊空間中存入不同類型數(shù)據(jù)。

所以共用體的概念就隨之產(chǎn)生,將幾種不同類型的內(nèi)容覆蓋到同一內(nèi)存單元,之前在我的一篇共用體專題寫過,但感覺自己總結(jié)的還不夠到位,這里再講講。

共用體原理

共用體和結(jié)構(gòu)體非常相似,共用體定義很簡(jiǎn)單,只需要 union + 共用體名即可,舉個(gè)栗子:

union student:
{
 char name;
 short age;
 int weight;
 char sex;
};

某種意義上,共用體與結(jié)構(gòu)體是差不多的數(shù)據(jù)結(jié)構(gòu),他們都可以同時(shí)包含多種數(shù)據(jù)類型。

但是!畢竟不叫同一個(gè)名兒就不是同一個(gè)玩意兒,那他們==本質(zhì)上的區(qū)別是啥?==這里我先從內(nèi)存方面下手,對(duì)于結(jié)構(gòu)體,在內(nèi)存中,他們有各自的存儲(chǔ)空間,不管這個(gè)這個(gè)成員我有沒有去使用他,C語言程序都會(huì)給他分配空間, 所以有結(jié)構(gòu)體類型長(zhǎng)度大于或等于各成員長(zhǎng)度之和一說。

而在共用體中,各成員在一坨空間里面,空間相當(dāng)于是共享的的公共空間,一個(gè)共用體類型長(zhǎng)度等于所有成員變量中最寬數(shù)據(jù)的長(zhǎng)度,比如我剛剛的student 這個(gè)共用體中 ,有 char,short和 int 類型,此時(shí)該共用體類型長(zhǎng)度就是4個(gè)字節(jié),也就是 int 類型長(zhǎng)度。強(qiáng)調(diào)一下,這里的共享并不是把多個(gè)變量同時(shí)放入一個(gè)共用體內(nèi),是指該共用體可被賦予任何一種變量的值,但每次賦值只能賦一種,多種還是會(huì)遵循共用體最長(zhǎng)數(shù)據(jù)覆蓋原則,也就是說共用體在同一時(shí)間只能存放一個(gè)變量。

引申一下

為了去確定當(dāng)前計(jì)算機(jī)的存儲(chǔ)模式,我們可以用共用體去試觸,判斷它是大端存儲(chǔ)還是小端存儲(chǔ),這樣簡(jiǎn)單又高效。

我們都知道計(jì)算機(jī)內(nèi)存是以字節(jié)為單位的劃分的,每個(gè)地址單元對(duì)應(yīng)一個(gè)字節(jié),一個(gè)字節(jié)占 8 個(gè) bit 位,一個(gè) bit 對(duì)應(yīng)存儲(chǔ)一個(gè)二進(jìn)制數(shù)據(jù),比如 00000000;

另外還有 int ,long ,long long,在16位和32位處理器中,可同時(shí)處理16 bit 和32 bit 的數(shù)據(jù),寄存器寬度都大于一個(gè)字節(jié),就此我們的大小端存儲(chǔ)模式應(yīng)運(yùn)而生。

字節(jié)順序

在搞清楚大小端模式之前必須搞清楚字節(jié)的順序,在兩個(gè)設(shè)備之間進(jìn)行數(shù)據(jù)的傳輸時(shí),我要把一個(gè)東西從A傳到B,但這時(shí)發(fā)現(xiàn)在A設(shè)備中,內(nèi)容是正序的,但是B設(shè)備中的內(nèi)容是反序放著的,我們就無法在傳輸后得到正確的格式,所以就要要求統(tǒng)一的模式。

大小端存儲(chǔ)

大端存儲(chǔ)是指數(shù)據(jù)的低位字節(jié)順序會(huì)存儲(chǔ)在內(nèi)存的高地址中,小端存儲(chǔ)模式則恰恰相反,比如我將一個(gè)十六進(jìn)制數(shù) 0x1234ffff,對(duì)應(yīng)字節(jié)序由低到高從 f 到 1 ,從右向左依次讀取較低位字節(jié)放在地址較大的內(nèi)存單元中,如下:

在這里插入圖片描述

小端存儲(chǔ)則會(huì)從右向左依次讀取較低位的字節(jié)存入地址較小的內(nèi)存單元中。

在這里插入圖片描述

在這里插入圖片描述

我們常用的X86結(jié)構(gòu),ARM就是小端模式,什么 C51則為大端模式(沒學(xué)我也不知道是個(gè)啥,但還是擺出來)。

共用體判斷大小端

union num
{
int a;
char b[2];
};

比如我定義一個(gè)num共用體類型,再創(chuàng)建一個(gè)共用體變量 union num i,這時(shí)內(nèi)存中會(huì)劃分出四個(gè)字節(jié)的大小用于存放 num1;假設(shè)i的char類型 i.b = 0x1234,雖然這時(shí)我num1中的char類型沒有被賦值,但已經(jīng)被我的 int 類型所覆蓋, 我們int 類型四個(gè)字節(jié)對(duì)應(yīng)四個(gè)空間,char類型只需一個(gè)空間,我們只需要觀察int的值是否在char空間中高位存放了低位字節(jié),是則為大端存儲(chǔ),反之則為小端存儲(chǔ),可用代碼打印如下:

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]);

效果如圖:

在這里插入圖片描述

可以看出我的電腦就是小端存儲(chǔ)滴。

今天就到這里吧,摸了家人們,更多關(guān)于C語言進(jìn)階大小端模式的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 詳解C語言如何實(shí)現(xiàn)雙向帶頭循環(huán)鏈表

    詳解C語言如何實(shí)現(xiàn)雙向帶頭循環(huán)鏈表

    雙向帶頭循環(huán)鏈表應(yīng)該是鏈表中非常方便的一種,可以很容易的在任意位置上進(jìn)行插入和刪除,可以很容易的對(duì)鏈表進(jìn)行管理。本文將利用C語言實(shí)現(xiàn)雙向帶頭循環(huán)鏈表,需要的可以參考一下
    2022-08-08
  • C++示例講解string容器

    C++示例講解string容器

    c++相比c的一個(gè)好處就是實(shí)現(xiàn)了很多的容器和泛型算法,使得程序員的工作得到了很大的簡(jiǎn)化,本文重點(diǎn)給大家介紹C++string容器基本概念講解,需要的朋友參考下吧
    2022-07-07
  • 淺談C++ IO流

    淺談C++ IO流

    這篇文章主要介紹了C++ IO流的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)c++,感興趣的朋友可以了解下
    2020-08-08
  • 詳解C#byte數(shù)組怎么傳入C

    詳解C#byte數(shù)組怎么傳入C

    在本篇內(nèi)容里小編給大家整理了關(guān)于C#byte數(shù)組怎么傳入C的相關(guān)知識(shí)點(diǎn)內(nèi)容,有興趣的朋友們學(xué)習(xí)參考下。
    2019-03-03
  • C++開發(fā)繪制正弦曲線的方法

    C++開發(fā)繪制正弦曲線的方法

    這篇文章主要為大家詳細(xì)介紹了C++繪制正弦曲線的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-06-06
  • C++11/C++14中constexpr的使用案例詳解

    C++11/C++14中constexpr的使用案例詳解

    C++11規(guī)定,允許將變量聲明為constexpr類型以便由編譯器來驗(yàn)證變量的值是否是一個(gè)常量表達(dá)式,這篇文章主要介紹了C++11/C++14中constexpr的使用,需要的朋友可以參考下
    2023-06-06
  • c語言中十進(jìn)制轉(zhuǎn)二進(jìn)制顯示小工具的實(shí)現(xiàn)代碼

    c語言中十進(jìn)制轉(zhuǎn)二進(jìn)制顯示小工具的實(shí)現(xiàn)代碼

    本篇文章是對(duì)c語言中十進(jìn)制轉(zhuǎn)二進(jìn)制顯示小工具的實(shí)現(xiàn)代碼進(jìn)行了詳細(xì)的分析的介紹,需要的朋友參考下
    2013-05-05
  • C語言選擇排序算法及實(shí)例代碼

    C語言選擇排序算法及實(shí)例代碼

    本篇文章主要介紹了 C語言選擇排序算法,這里提供代碼實(shí)例以便大家理解,通過本文,更好的理解排序算法
    2016-07-07
  • c++ TCHAR轉(zhuǎn)string導(dǎo)致中文缺失或亂碼問題及解決

    c++ TCHAR轉(zhuǎn)string導(dǎo)致中文缺失或亂碼問題及解決

    這篇文章主要介紹了c++ TCHAR轉(zhuǎn)string導(dǎo)致中文缺失或亂碼問題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • C語言實(shí)現(xiàn)BMP圖像開運(yùn)算處理

    C語言實(shí)現(xiàn)BMP圖像開運(yùn)算處理

    這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)BMP圖像開運(yùn)算處理,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-10-10

最新評(píng)論