摘要:我們常用的結構,就是小端模式,什么則為大端模式沒學我也不知道是個啥,但還是擺出來。
小編是大一菜鳥不贅述,歡迎大佬指點江山(QQ:1319365055)
此前博客點我!點我!請搜索博主 【知曉天空之藍】點我!點我!請搜索博主 【知曉天空之藍】或掃碼進入!
喬喬的gitee代碼庫(打灰人 )歡迎訪問,點我!
(https://blog.51cto.com)感謝支持!
現在是北京時間17:12,思政課當完漁夫剛回來,高產一波想起前天研究數組數據存儲模式時有涉及大小端,今天正好興致來了。今天早上睡了波回籠覺,yysy挺爽的,最近不是晚三人就是晚四人,屬實頂不住了
C語言中數據類型的存儲是較為嚴謹的,一塊空間只能存儲一種數據類型,要知道內存這個東西,在早期可是非常珍貴的。
尤其對于那些性能不好計算機更是如此,比如 Office1997,操作系統為Windows95 ,奔騰1的cpu,內存只有128M。就這么綠豆點大的存儲空間,要想達到節約,利用最大化就必須在同一塊空間中存入不同類型數據。
所以共用體的概念就隨之產生,將幾種不同類型的內容覆蓋到同一內存單元,之前在我的一篇共用體專題寫過,但感覺自己總結的還不夠到位,這里再講講。
共用體和結構體非常相似,共用體定義很簡單,只需要 union + 共用體名即可,舉個栗子:
union student:{ char name; short age; int weight; char sex;};
某種意義上,共用體與結構體是差不多的數據結構,他們都可以同時包含多種數據類型。
但是!,畢竟不叫同一個名兒就不是同一個玩意兒,那他們==本質上的區別是啥?==這里我先從內存方面下手,對于結構體,在內存中,他們有各自的存儲空間,不管這個這個成員我有沒有去使用他,C語言程序都會給他分配空間, 所以有結構體類型長度大于或等于各成員長度之和一說。
而在共用體中,各成員在一坨空間里面,空間相當于是共享的的公共空間,一個共用體類型長度等于所有成員變量中最寬數據的長度,比如我剛剛的student 這個共用體中 ,有 char,short和 int 類型,此時該共用體類型長度就是4個字節,也就是 int 類型長度。強調一下,這里的共享并不是把多個變量同時放入一個共用體內,是指該共用體可被賦予任何一種變量的值,但每次賦值只能賦一種,多種還是會遵循共用體最長數據覆蓋原則,也就是說共用體在同一時間只能存放一個變量。
引申一下
為了去確定當前計算機的存儲模式,我們可以用共用體去試觸,判斷它是大端存儲還是小端存儲,這樣簡單又高效。我們都知道計算機內存是以字節為單位的劃分的,每個地址單元對應一個字節,一個字節占 8 個 bit 位,一個 bit 對應存儲一個二進制數據,比如 00000000;另外還有 int ,long ,long long,在16位和32位處理器中,可同時處理16 bit 和32 bit 的數據,寄存器寬度都大于一個字節,就此我們的大小端存儲模式應運而生。
在搞清楚大小端模式之前必須搞清楚字節的順序,在兩個設備之間進行數據的傳輸時,我要把一個東西從A傳到B,但這時發現在A設備中,內容是正序的,但是B設備中的內容是反序放著的,我們就無法在傳輸后得到正確的格式,所以就要要求統一的模式。
大端存儲是指數據的低位字節順序會存儲在內存的高地址中,小端存儲模式則恰恰相反,比如我將一個十六進制數 0x1234ffff,對應字節序由低到高從 f 到 1 ,從右向左依次讀取較低位字節放在地址較大的內存單元中,如下:
小端存儲則會從右向左依次讀取較低位的字節存入地址較小的內存單元中。
我們常用的X86結構,ARM就是小端模式,什么 C51則為大端模式(沒學我也不知道是個啥,但還是擺出來)。
union num{int a;char b[2];};
比如我定義一個num共用體類型,再創建一個共用體變量 union num i,這時內存中會劃分出四個字節的大小用于存放 num1;假設i的char類型 i.b = 0x1234,雖然這時我num1中的char類型沒有被賦值,但已經被我的 int 類型所覆蓋, 我們int 類型四個字節對應四個空間,char類型只需一個空間,我們只需要觀察int的值是否在char空間中高位存放了低位字節,是則為大端存儲,反之則為小端存儲,可用代碼打印如下:
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]);
效果如圖:
可以看出我的電腦就是小端存儲滴。
今天就到這里吧,摸了家人們。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/124502.html
目錄 一、枚舉 (一)枚舉類型的定義 (二)使用枚舉的原因? (三)枚舉的優點? (四)枚舉的大小 (五)枚舉的使用 二、聯合(共用體) (一)聯合類型的定義 (二)聯合的特點 (三)面試題 (四)聯合大小的計算 一、枚舉 枚舉顧名思義就是:列舉?。? ?即把可能的取值一一列舉出來。 比如我們現實生活中: 一周當中從周一至周日的7天,可以一一列舉;性別有:男、女、保密,可以一一列舉;月份有...
摘要:的理解和區別代表有符號,整數在內存中存儲的二進制位的最高位為符號位,表示負數,表示正數。那接下來我們來學習數據在所開辟的內存空間時如何存儲的。請看下面例子為什么內存中存儲的是補碼對于整數來說數據存放內存中其實存放的是補碼。 ...
目錄 ? ?一、數據類型介紹 二、類型的意義 三、類型的基本歸類 整型家族 浮點數家族 構造類型(自定義類型) 指針類型 空類型 四、整形在內存中的存儲 原碼、反碼、補碼 大小端字節序 為什么有大端和小端? 一道經典筆試題 ?一、數據類型介紹 數據從大的方向分為兩類: 內置類型自定義類型內置類型我們前面已經學習過,如下: char? ? ? ? ? ? //字符數據類型 short? ? ? ...
摘要:函數式編程前端掘金引言面向對象編程一直以來都是中的主導范式。函數式編程是一種強調減少對程序外部狀態產生改變的方式。 JavaScript 函數式編程 - 前端 - 掘金引言 面向對象編程一直以來都是JavaScript中的主導范式。JavaScript作為一門多范式編程語言,然而,近幾年,函數式編程越來越多得受到開發者的青睞。函數式編程是一種強調減少對程序外部狀態產生改變的方式。因此,...
摘要:正則表達式使用單個字符串來描述匹配一系列匹配某個句法規則的字符串。接下來,是在手機正則里面已經出現了。序列匹配而則匹配。分組與反向引用分組,又稱為子表達式。把正則表達式拆分成小表達式。 本文轉載自網絡。轉載編輯過程中,可能有遺漏或錯誤,請以原文為準。原文作者:水墨寒湘原文鏈接:https://juejin.im/post/582dfc... 正則表達式對于我來說一直像黑暗魔法一樣的存...
閱讀 1201·2021-11-23 09:51
閱讀 1980·2021-10-08 10:05
閱讀 2339·2019-08-30 15:56
閱讀 1900·2019-08-30 15:55
閱讀 2640·2019-08-30 15:55
閱讀 2487·2019-08-30 13:53
閱讀 3498·2019-08-30 12:52
閱讀 1250·2019-08-29 10:57