關於大小端 位域的一些概念詳解

2022-10-04 04:42:08 字數 1504 閱讀 8697

大小端:

對於像c++中的char這樣的資料型別,它本身就是占用乙個位元組的大小,不會產生什麼問題。但是當數制型別為int,在32bit的系統中,它需要占用4個位元組(32bit),這個時候就會產生這4個位元組在暫存器中的存放順序的問題。比如int maxheight = 0x12345678,&maxheight = 0x0042ffc4。具體的該怎麼存放呢?這個時候就需要理解計算機的大小端的原理了。

大端:(big-endian)就是把數值的高位位元組放在記憶體的低位位址上,把數值的地位位元組放在記憶體的高位位址上。

小端:(little-endian)就是把數字的高位位元組放在高位的位址上,低位位元組放在低位位址上。

wyauyrls我們常用的x86結構都是小端模式,而大部分dsp,arm也是小端模式,不過有些arm是可以選擇大小端模式。wyauyrls所以對於上面的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占用www.cppcns.com1位(bit)儲存空間,8位組成乙個位元組(byte),為計算機中資料型別的最小單位,如char在32bit系統中占用乙個位元組。但是正如我們知道的,有時候程式中的資料可能並不需要這麼的位元組,比如乙個開關的狀態,只有開和關,用1和0分別替代就可以表示。此時開關的狀態只需要一位儲存空間就可以滿足要求。如果用乙個位元組來儲存,顯然浪費了另外的7位儲存空間。所以在c語言中就有了位段(有的也叫位域,其實是乙個東西)這個概念。具體的語法就是在變數名字後面,加上冒號(:)和指定的儲存空間的位數。具體的定義語法如下:

複製** **如下:

struct 位段名稱   

//例項  

struct node 

node;

其實定義很簡單,上面示例的意義是,定義乙個char變數a,占用2位儲存空間,乙個double變數i,以及乙個占用4位儲存的int變數c。請注意這裡改變了變數本來占用位元組的大小,並不是我們常規定義的乙個int變數占用4個位元組,乙個char變數占用1乙個位元組。在實際的執行環境中執行,由於記憶體位元組對齊,得到sizeof(node) = 24。

本文標題: 關於大小端、位域的一些概念詳解

本文位址:

關於大小端 位域的一些概念

大小端 對於像c 中的char這樣的資料型別,它本身就是占用乙個位元組的大小,不會產生什麼問題。但是當數制型別為int,在32bit的系統中,它需要占用4個位元組 32bit 這個時候就會產生這4個位元組在暫存器中的存放順序的問題。比如int maxheight 0x12345678,maxheig...

C C 大小端 位域 記憶體詳解

面試時遇到關於大小端 位段 或者叫位域 和記憶體對齊的考題,然後就不知所措了。這部分對於嵌入式底層工作者是必須要掌握的,其他方面不是必須的 但還是很有必要學習理解這些知識點,因為它可以讓你更了解c 的,了解程式在記憶體的運 況,也能加深對計算機系統的理解。1 從靜態儲存區分配 此時的內存在程式編譯的...

關於KVM一些概念

kvm kernel virtual machine核心虛擬機器 是乙個linux核心模組,可以用modprobe去載入kvm模組。載入模組後,才能進一步通過其他工具建立虛擬機器。但僅有kvm模組是不行的,因為使用者無法直接控制核心模組去作事情,所以還要有乙個使用者空間的工具才行。這個使用者空間的工...