c語(yǔ)言大小端(數(shù)據(jù)在內(nèi)存中的存儲(chǔ))
大小端模式介紹
- 大端(存儲(chǔ))模式:是指一個(gè)數(shù)據(jù)的低位字節(jié)序的內(nèi)容放在高地址處,高位字節(jié)序存的內(nèi)容放在低地址處。
- 小端(存儲(chǔ))模式:是指一個(gè)數(shù)據(jù)的低位字節(jié)序內(nèi)容存放在低地址處,高位字節(jié)序的內(nèi)容存放在高地址處。(可以總結(jié)為“小小小”即低位、低地址、小端)
在計(jì)算機(jī)系統(tǒng)中,我們是以字節(jié)為單位存放數(shù)據(jù)的,每個(gè)地址單元都對(duì)應(yīng)著一個(gè)字節(jié),一個(gè)字節(jié)為8bit。但在C語(yǔ)言中存在不同的數(shù)據(jù)類型,占用的字節(jié)數(shù)也各不相同,那么就存在怎樣存放多個(gè)字節(jié)的問(wèn)題,因此就出現(xiàn)了大端存儲(chǔ)模式和小端存儲(chǔ)模式。
我們可以創(chuàng)建一個(gè)整型變量i,在調(diào)試時(shí),打開調(diào)試>>窗口>>內(nèi)存,輸入&i,就可以在內(nèi)存窗口中看到變量i在內(nèi)存中是如何存儲(chǔ)的了。
從圖可以看出整型變量i在內(nèi)存中是其字節(jié)序低位的內(nèi)容存放在低地址,字節(jié)序高位的內(nèi)容存放在高地址,所以這臺(tái)機(jī)器是小端存儲(chǔ)模式。
由此我們可以通過(guò)觀察低地址處存放的內(nèi)容來(lái)判斷當(dāng)前機(jī)器的存儲(chǔ)模式,那么我們可以設(shè)計(jì)一個(gè)小程序來(lái)判斷當(dāng)前機(jī)器的存儲(chǔ)模式。
方法1:
#include <stdio.h> int main() { int i = 1; char *a = (char *)&i; if(*a == 1) printf("小端\n"); else printf("大端\n"); return 0; }
方法2:共同體判斷
int Check_Sys() { union { int i; char c; }un; un.i = 1; return un.c;//如果是小端返回1,如果是大端返回0 } int main() { if(Check_Sys()) printf("小端\n"); else printf("大端\n"); return 0; }
上面的共用體變量un,大小sizeof(un)=4,注意使用共用體(聯(lián)合)判斷時(shí),不能僅依靠公用類型最大者為其共用體變量大小,應(yīng)遵守對(duì)其原則和補(bǔ)齊原則。
對(duì)齊原則:結(jié)構(gòu)體變量中元素是按照定義順序一個(gè)一個(gè)放到內(nèi)存中去的,但并不是緊密排列的。從結(jié)構(gòu)體存儲(chǔ)的首地址開始,每一個(gè)元素放置到內(nèi)存中時(shí),它都會(huì)認(rèn)為內(nèi)存是以它自己的大小來(lái)劃分的,因此元素放置的位置一定會(huì)在自己寬度的整數(shù)倍上開始(以結(jié)構(gòu)體變量首地址為0計(jì)算)。
補(bǔ)齊原則:檢查計(jì)算出的存儲(chǔ)單元是否為所有元素中所占內(nèi)存最大的元素的長(zhǎng)度的整數(shù)倍,是,則結(jié)束;若不是,則補(bǔ)齊為它的整數(shù)倍。
舉一個(gè)例子:
union Un { int i; char arr[5]; };
sizeof(union Un)=8
到此這篇關(guān)于c語(yǔ)言大小端(數(shù)據(jù)在內(nèi)存中的存儲(chǔ))的文章就介紹到這了,更多相關(guān)c語(yǔ)言大小端內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++實(shí)現(xiàn)LeetCode(46.全排列)
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(46.全排列),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)易五子棋
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)易五子棋,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-10-10C語(yǔ)言?模擬實(shí)現(xiàn)memcpy與memmove函數(shù)詳解
這篇文章主要介紹了C語(yǔ)言詳解如何模擬內(nèi)存函數(shù),用到了mencpy與memmove兩個(gè)函數(shù),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2022-04-04

windows上安裝CLion教程及簡(jiǎn)單使用詳解

C語(yǔ)言超詳細(xì)講解函數(shù)指針的運(yùn)用

C語(yǔ)言中結(jié)構(gòu)體、聯(lián)合體的成員內(nèi)存對(duì)齊情況

基于c語(yǔ)言知識(shí)點(diǎn)的補(bǔ)遺介紹

C語(yǔ)言模擬內(nèi)存函數(shù)分析之mencpy與memmove