CPU處理器大小端筆記

CPU 處理器大小端筆記

前言

CPU的大小端問題,在進行網絡協議開發和跨平臺開發的時候,是不可避免會遇到的問題,瞭解清楚了大小端問題,會更好的設計和使用通信協議。

大小端說明

存儲器中對數據的存儲是以字節(Byte)爲基本單位的,因此,字(Word)和半字(Half-Word)在存儲器中就有兩種次序,分別稱爲:大端模式(Big Endian)和小端模式(Little Endian)。

如果要在一個 int 型 四字節的變量中存放一個數值是 0x12345678的數據。大小端的CPU的存放形式如下。

大端(高尾端)

低地址存放高字節數據

內存地址 數據
0x0000 0x12
0x0001 0x34
0x0002 0x56
0x0003 0x78

大端字節序 也被用於 TCP/IP協議上,因此也稱作 網絡字節序。

小端(低尾端)

低地址存放低字節數據

內存地址 數據
0x0000 0x78
0x0001 0x56
0x0002 0x34
0x0003 0x12

如何記憶

在數據存儲過程中,總是從存儲器的低地址開始存儲的。

假設一個 int 型四字節的變量的存儲起始地址爲0x0,那麼如果要存儲一個變量,該類型的數據會佔用4個字節,內存地址從0x0~0x3。

如果要存儲一個數值爲 0x12345678 的數據。

如果採用大端方式存儲,那麼會將數據的高字節先存入首地址,然後依次存儲。

既將 0x12 存儲到 0x00 中

將 0x34 存儲到 0x01 中

將 0x56 存儲到 0x02 中

將 0x78 存儲到 0x03 中

內存地址 數據
0x0000 0x12
0x0001 0x34
0x0002 0x56
0x0003 0x78

如果採用小端方式存儲,那麼會將數據的低字節先存入首地址,然後依次存儲。

既將 0x78 存儲到 0x00 中

將 0x56 存儲到 0x01 中

將 0x34 存儲到 0x02 中

將 0x12 存儲到 0x03 中

內存地址 數據
0x0000 0x78
0x0001 0x56
0x0002 0x34
0x0003 0x12

使用C語言聯合體判斷一個處理器採用大端存儲還是小端存儲

#include "stdio.h"
int main()
{
  union w
 {
  int a;  //4 bytes
  char b; //1 byte
 } c;
  c.a=1;
  if (c.b==1)
  printf("It is Little_endian!\n");
  else
  printf("It is Big_endian!\n");
  return 1;
}


參考資料鏈接

輕鬆記住大端小端的含義

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章