大小端:
對于像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 Node
{
char a:2;
double i;
int c:4;
}node;
新聞熱點
疑難解答
圖片精選