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

C語言進階幾分鐘帶你理解大小端存儲模式

 更新時間:2022年02月16日 08:46:53   作者:喬喬家的龍龍  
這篇文章主要為大家介紹了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語言如何實現(xiàn)雙向帶頭循環(huán)鏈表

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

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

    C++示例講解string容器

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

    淺談C++ IO流

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

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

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

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

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

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

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

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

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

    C語言選擇排序算法及實例代碼

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

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

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

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

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

最新評論