計算機中的位元組序問題

2021-06-20 14:05:39 字數 1438 閱讀 8210

地點:基地

——————————————————————————————

程式設計中的資料型別有很多事跨多個位元組的,比如char是用乙個位元組表示,而諸如int,float型別則用4個位元組表示double則用8個位元組表示,我們知道,資料物件例項是儲存在一定位址單元中的,我們也知道,儲存器中的每個位元組都由乙個唯一的位址標誌或者是儲存。那麼當資料物件跨多個位元組時,各位元組時如何安排儲存的呢?這就是位元組序的問題。

——————————————————————————————

我們先來考慮乙個w位的資料物件,將它表示為:[x-1,xw-2,xw-3......x0],其中xw我們稱之為最高有效位,x0稱之為最低有效位,我們還假設w為8的倍數,這樣可以方便將該資料劃分為若干個位元組,那麼[xw-1,xw-2,xw-3......xw-8]為最高有效位元組,[x7,x6,x5......x0]為最低有效位元組。我們的儲存單元位址則由低到高逐次遞增,比如0x100->0x101->0x102......

建立起這個基本模型後,我們安排多個位元組時可以將最高有效位元組放在最前面,叫做大端法。也可以將最低有效位元組放在最前面,叫做小端法。而具體採用哪種順序則取決於機器。知道機器的位元組序表示方法這對於有些應用程式的開發非常重要。

——————————————————————————————

下面是一段程式例項,用以查閱不同型別資料在機器中表示方法。思路是:我們首先獲取資料物件的儲存位址,當然,對於跨多位元組物件來說,我們只能得到儲存他得首位址,然後根據型別的大小,可以遍歷儲存該物件的所有位址單元。我們不是說了嗎,每個位址單元都對於儲存乙個位元組,我們從前往後遍歷資料物件的所有位址單元,並把它用十六進製制顯示,檢查它到底是最高有效位元組放前面還是最低有效位元組放前面,就可以分辨出你的機器是大端法儲存資料還是小端法儲存資料了。

#includetypedef unsigned char *byte_pointer;

void show_bytes(byte_pointer start, int len)

void show_int(int x)

void show_float(float x)

void show_pointer(void *x)

int main()

註解:**中我們定義了乙個byte_pointer的資料型別,它為乙個指向型別為 unsigned char的物件的指標型別,我們前面不是說了嗎,資料型別可能是跨多個位元組的,而unsigned char恰好是佔據乙個位元組,這樣我們可將資料位址通過強制轉換為

unsigned char* 告訴編譯器,程式乙個把這裡的位址看成乙個位元組序列,而不是指向乙個原始的資料型別物件,即告訴編譯器以一種新的方式來看待被指向的資料。打個比方說:有一層樓有很多個大小一致的房間,而且編了號,處於某種應用,比如家庭旅行住宿,每家都要挨在一塊的四個房間,且看成乙個整體,且用每個家庭的第乙個房間就代表這一家,現在這種轉換就是把每一家的房間以每一間的方式去看待裡面的具體內容。

計算機中多位元組儲存順序,小端 大端 網路位元組序

1.2在計算機中的儲存為10 2.x 1 等價於乘2 如果要有左右順序來看計算機記憶體的排列的話,那麼排序順序如下 也就是記憶體從右到左公升序。例子 觀察int在計算機是如何儲存的 int a 197121 0 3 2 1 int p a char cp char p std cout adrs i...

資料在計算機中的儲存(位元組序,浮點數)

1 大端模式 低位址 高位址 0x12 0x34 0x56 0x78 2 小端模式 低位址 高位址 0x78 0x56 0x34 0x12 3 常見大小端模式 一般作業系統都是小端,而通訊協議是大端的。big endian powerpc ibm sun little endian x86 dec ...

計算機基礎 位元組序轉換

位元組序,顧名思義就是計算機儲存基本資料型別時 位元組的排列順序,計算機儲存位元組的順序分為兩種 大端位元組序和小端位元組序,儲存方式為 大端位元組序的0x11在硬體位址的高位,而小端位元組序的0x11在位址的低位。如圖 數值 0x11223344 大端 0x11223344 小端 0x443322...