儲存模式:
小端:較高的有效位元組儲存在較高的儲存器位址,較低的有效位元組儲存在較低的儲存器位址。
大端:較高的有效位元組儲存在較低的儲存器位址,較低的有效位元組儲存在較高的儲存器位址。
那麼,在記憶體裡面,其儲存就變成了:
| 位址 | hex |
|0x4000 0000 | 78 56 34 12 |
更為簡單一點:
低位址---------->高位址【大端模式】:
資料高位------->資料低位
0x12|0x34|0x56|0x78|
低位址---------->高位址【小端模式】:
資料低位-------->資料高位
0x78|0x56|0x34|0x12|
大端與小端的優勢
二者無所謂優勢,無所謂劣勢,各自優勢便是對方劣勢
大端模式:符號位的判定固定為第乙個位元組,容易判斷正負。
小端模式:強制轉換資料不需要調整位元組內容,1、2、4位元組的儲存方式一樣
陣列在大端小端情況下的儲存:
以unsigned int value = 0x12345678為例,
分別看看在兩種位元組序下其儲存情況,
我們可以用unsigned char buf[4]來表示value:
big-endian: 低位址存放高位
,如下:
高位址 資料位
| --------------- |
| buf[3] (0x78) -- 低位
| buf[2] (0x56) |
| buf[1] (0x34) |
| buf[0] (0x12) -- 高位
| ---------------
低位址
little-endian: 低位址存放低位
,如下:
高位址---------------
buf[3] (0x12) -- 高位
buf[2] (0x34)
buf[1] (0x56)
buf[0] (0x78) -- 低位
--------------
低位址為何會出現大小端之分:
這是因為在計算機系統中,我們是以位元組為單位的,
每個位址單元都對應著乙個位元組,乙個位元組為8bit。
但是在c語言中除了8bit的char之外,還有16bit的short型,32bit的long型(要看具體的編譯器),
另外,對於位數大於8位的處理器,例如16位或者32位的處理器,
由於暫存器寬度大於乙個位元組,那麼必然存在著乙個如果將多個位元組安排的問題。
因此就導致了大端儲存模式和小端儲存模式。
例如乙個16bit的short型x,在記憶體中的位址為0x0010,x的值為0x1122,
那麼0x11為高位元組,0x22為低位元組。對於大端模式,就將0x11放在低位址中,即0x0010中,
0x22放在高位址中,即0x0011中。小端模式,剛好相反。
我們常用的x86結構是小端模式,而keil c51則為大端模式。
很多的arm,dsp都為小端模式。有些arm處理器還可以由硬體來選擇是大端模式還是小端模式。
位元組序:【一般作業系統都是小端,而通訊協議是大端的】
常見cpu位元組序:
big endian : powerpc、ibm、sun
little endian : x86、dec
arm既可以工作在大端模式,也可以工作在小端模式
stm32中大小端轉換
相同位元組序的平台 你是大端平台 在進行網路通訊時可以不進行位元組序轉換,但是跨平台 你是小端平台 進行網路資料通訊時必須進行位元組序轉換。網路協議規定接收到得第乙個位元組是高位元組,存放到低位址,所以傳送時會首先去低位址取資料的高位元組。小端模式的多位元組資料在存放時,低位址存放的是低位元組,而被...
STM32 結構體的位元組對齊和大小端
1 測試平台 本次實驗的平台以32位cortexm0微控制器,不同的平台的實驗結果可能是不一樣的,但是思路都一樣。2 基礎概念 先介紹三個概念 自身對齊值 指定對齊值 有效對齊值。自身對齊值 資料型別本身的對齊值,例如char型別的自身對齊值是1,short型別是2,int型別是4 指定對齊值 編譯...
關於STM32資料的大小端問題以及可能的解決辦法
最近著手於開發rpimouse的通訊協議,第一次接觸crc校驗,發現有很多問題。32本身是帶有硬體crc校驗的,但是他的校驗結果和pc演算法計算出來的完全不同。在查詢解決方法的過程中得知32資料和pc資料的大小端不同,資料計算結果當然不同。什麼是大小端呢?比如 數字0x12 34 56 78 在記憶...