關(guān)于大小端、位域的一些概念詳解
大小端:
對(duì)于像C++中的char這樣的數(shù)據(jù)類(lèi)型,它本身就是占用一個(gè)字節(jié)的大小,不會(huì)產(chǎn)生什么問(wèn)題。但是當(dāng)數(shù)制類(lèi)型為int,在32bit的系統(tǒng)中,它需要占用4個(gè)字節(jié)(32bit),這個(gè)時(shí)候就會(huì)產(chǎn)生這4個(gè)字節(jié)在寄存器中的存放順序的問(wèn)題。比如int maxHeight = 0x12345678,&maxHeight = 0x0042ffc4。具體的該怎么存放呢?這個(gè)時(shí)候就需要理解計(jì)算機(jī)的大小端的原理了。
大端:(Big-Endian)就是把數(shù)值的高位字節(jié)放在內(nèi)存的低位地址上,把數(shù)值的地位字節(jié)放在內(nèi)存的高位地址上。
小端:(Little-Endian)就是把數(shù)字的高位字節(jié)放在高位的地址上,低位字節(jié)放在低位地址上。
我們常用的x86結(jié)構(gòu)都是小端模式,而大部分DSP,ARM也是小端模式,不過(guò)有些ARM是可以選擇大小端模式。所以對(duì)于上面的maxHeight是應(yīng)該以小端模式來(lái)存放,具體情況請(qǐng)看下面兩表。
地址 | 0x0042ffc4 | 0x0042ffc5 | 0x0042ffc6 | 0x0042ffc7 |
數(shù)值 |
0x78 |
0x56 |
0x34 |
0x12 |
圖(1)為小端模式
地址 | 0x0042ffc4 | 0x0042ffc5 | 0x0042ffc6 | 0x0042ffc7 |
數(shù)值 |
0x12 |
0x34 |
0x56 |
0x78 |
圖(2)為大端模式
通過(guò)上面的表格,可以看出來(lái)大小端的不同,在這里無(wú)法討論那種方式更好,個(gè)人覺(jué)得似乎大端模式更符合我的習(xí)慣。(注:在這里我還要說(shuō)一句,其實(shí)在計(jì)算機(jī)內(nèi)存中并不存在所謂的數(shù)據(jù)類(lèi)型,比如char,int等的。這個(gè)類(lèi)型在代碼中的作用就是讓編譯器知道每次應(yīng)該從那個(gè)地址起始讀取多少位的數(shù)據(jù),賦值給相應(yīng)的變量。)
位域:
在計(jì)算機(jī)中是采用二進(jìn)制0和1來(lái)表示數(shù)據(jù)的,每一個(gè)0或者1占用1位(bit)存儲(chǔ)空間,8位組成一個(gè)字節(jié)(byte),為計(jì)算機(jī)中數(shù)據(jù)類(lèi)型的最小單位,如char在32bit系統(tǒng)中占用一個(gè)字節(jié)。但是正如我們知道的,有時(shí)候程序中的數(shù)據(jù)可能并不需要這么的字節(jié),比如一個(gè)開(kāi)關(guān)的狀態(tài),只有開(kāi)和關(guān),用1和0分別替代就可以表示。此時(shí)開(kāi)關(guān)的狀態(tài)只需要一位存儲(chǔ)空間就可以滿足要求。如果用一個(gè)字節(jié)來(lái)存儲(chǔ),顯然浪費(fèi)了另外的7位存儲(chǔ)空間。所以在C語(yǔ)言中就有了位段(有的也叫位域,其實(shí)是一個(gè)東西)這個(gè)概念。具體的語(yǔ)法就是在變量名字后面,加上冒號(hào)(:)和指定的存儲(chǔ)空間的位數(shù)。具體的定義語(yǔ)法如下:
struct 位段名稱
{
位段數(shù)據(jù)類(lèi)型 位段變量名稱 : 位段長(zhǎng)度;
.......
}
//實(shí)例
struct Node
{
char a:2;
double i;
int c:4;
}node;
其實(shí)定義很簡(jiǎn)單,上面示例的意義是,定義一個(gè)char變量a,占用2位存儲(chǔ)空間,一個(gè)double變量i,以及一個(gè)占用4位存儲(chǔ)的int變量c。請(qǐng)注意這里改變了變量本來(lái)占用字節(jié)的大小,并不是我們常規(guī)定義的一個(gè)int變量占用4個(gè)字節(jié),一個(gè)char變量占用1一個(gè)字節(jié)。在實(shí)際的運(yùn)行環(huán)境中運(yùn)行,由于內(nèi)存字節(jié)對(duì)齊,得到sizeof(node) = 24。
欄 目:C語(yǔ)言
下一篇:typedef和#define的用法以及區(qū)別
本文標(biāo)題:關(guān)于大小端、位域的一些概念詳解
本文地址:http://mengdiqiu.com.cn/a1/Cyuyan/4021.html
您可能感興趣的文章
- 01-10節(jié)序問(wèn)題:解析大小的端判定
- 01-10基于大端法、小端法以及網(wǎng)絡(luò)字節(jié)序的深入理解
- 01-10ubuntu中打開(kāi)終端的三種解決方法
- 01-10解決不用sizeof求出int大小的方法
- 01-10關(guān)于C語(yǔ)言函數(shù)strstr()的分析以及實(shí)現(xiàn)
- 01-10關(guān)于C語(yǔ)言除0引發(fā)的思考
- 01-10關(guān)于c語(yǔ)言的一個(gè)小bug詳解
- 01-10關(guān)于C/C++中static關(guān)鍵字的作用總結(jié)
- 01-10關(guān)于C++中虛擬繼承的一些總結(jié)分析
- 01-10CStdioFile的用法詳細(xì)解析


閱讀排行
- 1C語(yǔ)言 while語(yǔ)句的用法詳解
- 2java 實(shí)現(xiàn)簡(jiǎn)單圣誕樹(shù)的示例代碼(圣誕
- 3利用C語(yǔ)言實(shí)現(xiàn)“百馬百擔(dān)”問(wèn)題方法
- 4C語(yǔ)言中計(jì)算正弦的相關(guān)函數(shù)總結(jié)
- 5c語(yǔ)言計(jì)算三角形面積代碼
- 6什么是 WSH(腳本宿主)的詳細(xì)解釋
- 7C++ 中隨機(jī)函數(shù)random函數(shù)的使用方法
- 8正則表達(dá)式匹配各種特殊字符
- 9C語(yǔ)言十進(jìn)制轉(zhuǎn)二進(jìn)制代碼實(shí)例
- 10C語(yǔ)言查找數(shù)組里數(shù)字重復(fù)次數(shù)的方法
本欄相關(guān)
- 04-02c語(yǔ)言函數(shù)調(diào)用后清空內(nèi)存 c語(yǔ)言調(diào)用
- 04-02func函數(shù)+在C語(yǔ)言 func函數(shù)在c語(yǔ)言中
- 04-02c語(yǔ)言的正則匹配函數(shù) c語(yǔ)言正則表達(dá)
- 04-02c語(yǔ)言用函數(shù)寫(xiě)分段 用c語(yǔ)言表示分段
- 04-02c語(yǔ)言中對(duì)數(shù)函數(shù)的表達(dá)式 c語(yǔ)言中對(duì)
- 04-02c語(yǔ)言編寫(xiě)函數(shù)冒泡排序 c語(yǔ)言冒泡排
- 04-02c語(yǔ)言沒(méi)有round函數(shù) round c語(yǔ)言
- 04-02c語(yǔ)言分段函數(shù)怎么求 用c語(yǔ)言求分段
- 04-02C語(yǔ)言中怎么打出三角函數(shù) c語(yǔ)言中怎
- 04-02c語(yǔ)言調(diào)用函數(shù)求fibo C語(yǔ)言調(diào)用函數(shù)求
隨機(jī)閱讀
- 01-11Mac OSX 打開(kāi)原生自帶讀寫(xiě)NTFS功能(圖文
- 08-05DEDE織夢(mèng)data目錄下的sessions文件夾有什
- 01-11ajax實(shí)現(xiàn)頁(yè)面的局部加載
- 01-10C#中split用法實(shí)例總結(jié)
- 01-10使用C語(yǔ)言求解撲克牌的順子及n個(gè)骰子
- 01-10SublimeText編譯C開(kāi)發(fā)環(huán)境設(shè)置
- 08-05dedecms(織夢(mèng))副欄目數(shù)量限制代碼修改
- 08-05織夢(mèng)dedecms什么時(shí)候用欄目交叉功能?
- 01-10delphi制作wav文件的方法
- 04-02jquery與jsp,用jquery