大端組織與小端組織

2021-06-23 05:23:12 字數 1423 閱讀 1063

搞清乙個機器是大端組織還是小端組織要依據對於  計算機內部的資料通訊非常重要。雖然,目前我們大多數用到的資料格式都是統一的,但是了解這個概念對於一些在不同硬體平台上執行的可移值程式設計是很有幫助的。

所謂組織是  cpu如何對乙個字或者雙字的最低位元組進行儲存,即儲存在記憶體中的哪個位置。

所謂大端,是把位元組從記憶體中的高位開始儲存。 而小端正好相反。

當然,儲存在何種位置,是依據cpu設計者的思維而定的,本質上沒有任何區別。

比如,mac機和unix機就是採用了大端組織,而pc用的是小端組織。 但是有些網路協議也採用的是大端組織。

因此,在不同機器上,資料會對應著不同的格式。

我們稱這兩種不同的資料排列方式為: 不同的性別。

所以當大端組織與小端組織進行通訊時,它們的資料格式會不一致,導致出現錯誤的結果。

需要將它們都轉換為乙個統一的標準格式。

例如: 如果是通過網路傳輸資料,標準格式往往是大端格式。  而當通過通用序列匯流排(usb)傳輸資料的時候,標準格式就是小端組織。

映象交換:

為了在大小端格式之間進行轉換, 必須對物件中的各個位元組進行映象交換。這種交換是中心對稱的。

對雙字進行大端格式與小端格式的轉換。  首先交換第零個位元組和第三個位元組,然後交換第乙個位元組與第二個位元組

單個機器上的軟體通訊也會遭遇大端和小端的情況:

如: 有些程式會使用分立的位元組來組合更大的物件,它們在這個大物件中給這些位元組分配特定的位置。如果在一台大端機器上, 軟體將最低位元組放置在第零位到第七位處, 程式不會產生正確的結果。

用分立的位元組來組成大的物件,可以使聯合結構體。

考慮一下32位的聯合結構體:

union

thevalue;

小端機器上, 四個分立的位元組組成乙個32位物件, 使用的**如下:

thevalue.bytes[0] = byte0;

thevalue.bytes[1] = byte1;

thevalue.bytes[2] = byte2;

thevalue.bytes[3] = byte3;

但是在大端機器上,需要如下賦值:

thevalue.bytes[0] = byte3;

thevalue.bytes[1] = byte2;

thevalue.bytes[2] = byte1;

thevalue.bytes[3] = byte0;

如何判斷是大端機器還是小端機器:

可以用如下**:

thevalue.bytes[0] = 0;

thevalue.bytes[1] = 1;

thevalue.bytes[2] = 0;

thevalue.bytes[3] = 1;

islittleendian=thevalue.bits32== 256;

如果等於,則是小端機器,如果大於則是大端機器

大端與小端

網際網路使用網路位元組順序採用大端模式進行編址,大端儲存也稱為網路位元組序,因為tcp ip包在網路中傳輸時都要求以這種次序,以其他形式儲存資料的機器 主機位元組順序根據處理器的不同而不同,如powerpc處理器,使用大端模式,而pentuim處理器使用小端模式 則必須在傳送資料之前把首部轉換成網路...

大端與小端

端模式 endian 的這個詞出自 jonathan swift 書寫的 格列佛遊記 這本書根據將雞蛋敲開的方法不同將所有的人分為兩類,從圓頭開始將雞蛋敲開的人被歸為 big endian 從尖頭開始將雞蛋敲開的人被歸為 littile endian 小人國的內戰就源於吃雞蛋時是究竟從大頭 big ...

大端與小端

大端表示跟小端表示這兩者的具體意義我老是記不住,當然不是說它的意思不懂,而只是容易搞混。現在記一下,以後就比較有印象了。在c 中,定義乙個int值的時候,它所占用的記憶體是4個位元組,然而這4個位元組裡面,我們如果得到這個int值的記憶體位址,其實就是它的最低位置的位址,如 int a 假設 a的記...