01 大端小端

2021-09-11 03:15:48 字數 2018 閱讀 8540

計算機儲存資料是按大端或者小端將資料儲存在記憶體上. 一般處理器都只選擇其中的一種, 通常intelamd處理器都是採用小端儲存方式, 也有一些處理器是採用大端方式, 如果ibm公司的處理器.

小端儲存 :

0x1003

0x78

0x1002

0x56

0x1001

0x34

0x1000

0x12

大端儲存 :

0x1003

0x12

0x1002

0x34

0x1001

0x56

0x1000

0x78

大端跟小端儲存資料的方式就不一樣. 比如像0x12345678, 在兩種方式的儲存如上. 小端 : 將高位元組放在高位, 低位元組放在低位. 大端 : 將高位元組放在低位, 低位元組放在高位. 如果我們在傳輸資料的時候如果小端處理器傳送給大端處理器, 那麼在接收資料後都無法辨認資料究竟是什麼, 所以為了保證資料可以在不同的儲存方式上都能夠被正確的接收, 規定網路傳輸是大端傳輸, 當資料接收到本地時再根據處理器儲存資料的方式進行轉化, 這樣就保證接收後不會資料無法辨認.

驗證本機的儲存方式

大端還是小端的驗證有很多種方法, 這裡就簡單的用兩種方式來驗證.

實驗一

大端跟小端是在儲存資料的方式上不一樣, 就像0x12345678, 我們將其中的低位元組取出來檢視是0x12還是0x78就可以驗證本機的使用的是小端還是大端了.

#include

#include

#include

intmain

(int argc,

char

*ar**)

我的電腦驗證的是小端.

實驗二

我們也可以用union來驗證, 原理與上面一樣的, 只是運用了union本身就是直接共用儲存空間的.

#include

#include

#include

union tmp

;int

main

(int argc,

char

*ar**)

大端和小端之間的轉換

在網路程式設計中, 可以使用以下4個函式對資料在大小端之間進行轉換.

#include

uint32_t htonl

(uint32_t)

;// 本機位元組轉為網路位元組(32位)

uint32_t ntohl

(uint32_t)

;// 網路位元組轉為本機位元組(32位)

uint16_t htons

(uint16_t)

;// 本機位元組轉為網路位元組(16位)

uint16_t ntohs

(uint16_t)

;// 網路位元組轉為本機位元組(16位)

網路位元組是大端方式. 上面函式的可以這樣記 :h表示host(本機),n表示network(網路),to轉換,l長位元組,s短位元組.

可以使用驗證一下 :

#include

#include

#include

#include

intmain

(int argc,

char

*ar**)

完整** : 大端小端 總結

這裡僅僅用簡單的例子驗證本機的大小端, 重點明白

(1 1 27)大端和小端問題

所謂的大端模式,是指資料的低位儲存在記憶體的高位址中,而資料的高位,儲存在記憶體的低位址中 網路傳輸是大端儲存模式 所謂的小端模式,是指資料的低位儲存在記憶體的低位址中,而資料的高位儲存在記憶體的高位址中。為什麼會有大小端模式之分呢?這是因為在計算機系統中,我們是以位元組為單位的,每個位址單元都對應...

002 大端和小端的區別

一 大小端出現原因 計算機系統是以位元組為單位的,每個位址單元都對應著乙個位元組,乙個位元組為8bit。但對於位數大於8位的處理器,如16位或32位 64位的處理器,由於暫存器寬度大於乙個位元組,那麼必然存在乙個如何將多個位元組安排的問題。因此就導致了大端儲存模式和小端儲存模式的出現。二 為什麼會有...

認識(大端 小端)端模式

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