關於年夜小端、位域的一些概念詳解。本站提示廣大學習愛好者:(關於年夜小端、位域的一些概念詳解)文章只能為提供參考,不一定能成為您想要的結果。以下是關於年夜小端、位域的一些概念詳解正文
年夜小端:
關於像C++中的char如許的數據類型,它自己就是占用一個字節的年夜小,不會發生甚麼成績。然則當數制類型為int,在32bit的體系中,它須要占用4個字節(32bit),這個時刻就會發生這4個字節在存放器中的寄存次序的成績。好比int maxHeight = 0x12345678,&maxHeight = 0x0042ffc4。詳細的該怎樣寄存呢?這個時刻就須要懂得盤算機的年夜小真個道理了。
年夜端:(Big-Endian)就是把數值的高位字節放在內存的低位地址上,把數值的位置字節放在內存的高位地址上。
小端:(Little-Endian)就是把數字的高位字節放在高位的地址上,低位字節放在低位地址上。
我們經常使用的x86構造都是小端形式,而年夜部門DSP,ARM也是小端形式,不外有些ARM是可以選擇年夜小端形式。所以關於下面的maxHeight是應當以小端形式來寄存,詳細情形請看上面兩表。
地址 0x0042ffc4 0x0042ffc5 0x0042ffc6 0x0042ffc7
數值
0x78
0x56
0x34
0x12
圖(1)為小端形式
地址 0x0042ffc4 0x0042ffc5 0x0042ffc6 0x0042ffc7 數值0x12
0x34
0x56
0x78
圖(2)為年夜端形式
經由過程下面的表格,可以看出來年夜小真個分歧,在這裡沒法評論辯論那種方法更好,小我認為仿佛年夜端形式更相符我的習氣。(注:在這裡我還要說一句,其其實盤算機內存中其實不存在所謂的數據類型,好比char,int等的。這個類型在代碼中的感化就是讓編譯器曉得每次應當從誰人地址肇端讀取若干位的數據,賦值給響應的變量。)
位域:
在盤算機中是采取二進制0和1來表現數據的,每個0或許1占用1位(bit)存儲空間,8位構成一個字節(byte),為盤算機中數據類型的最小單元,如char在32bit體系中占用一個字節。然則正如我們曉得的,有時刻法式中的數據能夠其實不須要這麼的字節,好比一個開關的狀況,只要開和關,用1和0分離替換便可以表現。此時開關的狀況只須要一名存儲空間便可以知足請求。假如用一個字節來存儲,明顯糟蹋了別的的7位存儲空間。所以在C說話中就有了位段(有的也叫位域,實際上是一個器械)這個概念。詳細的語法就是在變量名字前面,加上冒號(:)和指定的存儲空間的位數。詳細的界說語法以下:
struct 位段稱號
{
位段數據類型 位段變量稱號 : 位段長度;
.......
}
//實例
struct Node
{
char a:2;
double i;
int c:4;
}node;
其實界說很簡略,下面示例的意義是,界說一個char變量a,占用2位存儲空間,一個double變量i,和一個占用4位存儲的int變量c。請留意這裡轉變了變量原來占用字節的年夜小,其實不是我們慣例界說的一個int變量占用4個字節,一個char變量占用1一個字節。在現實的運轉情況中運轉,因為內存字節對齊,獲得sizeof(node) = 24。