大小端的引入
在計算機系統中,我們是以位元組為單位的,每個位址單元都對應著乙個位元組,乙個位元組為8bit。但是在c語言中除了8bit的char之外,還有16bit的short型別,32bit的int型別,另外位數大於8位的處理器,例如16位或者32位bit的處理器,由於暫存器寬度大於乙個位元組,要麼必然存在著乙個如何將多個位元組安排的問題。因此導致了大端儲存模式和小端儲存模式。
什麼叫大小端?
大端儲存模式:
大端模式,是指資料的高位元組儲存在記憶體的低位址中,而資料的低位元組儲存在記憶體的高位址中,這樣的儲存模式有點類似把資料當做字串順序處理:位址由小向大增加,而資料從高位往地位放。
小端儲存模式
小端模式,是指資料的高位元組儲存在記憶體的高位址中,而資料的低位元組儲存在記憶體的低位址中,這種儲存模式將位址的高低和資料位權有效的結合起來,高位址部分權值高,低位址部分權值低。
如何判斷當前使用的系統時大端還是小端呢?
有兩種方案可以解決這個問題:
①訪問乙個聯合體
聯合體的特點就是,同一時刻只能訪問到乙個資料成員,那麼對它進行初始化的時候,只對第乙個成員進行初始化,試比較它的第乙個成員和它的第二個成員,如果相同,則就說明是大端,否則就是小端。
基本實現
#include
union port
;int main()
else
return
0;}
測試用例
我的環境是linux x86 32bit gcc。
②型別強轉
使用乙個整型型別的變數存放乙個8進製的資料,強轉為字元型別之後,然後訪問這個變數,可以根據資料判斷大小端。不多說了,直接上**,思路更清晰!
#include
int main()
if (c[0] == 0x12)
return
0;}
測試用例
暫時就這麼多了,繼續前進!
C語言 檢測大小端儲存
include int sys check else int main else return 0 此外,可以使用聯合體 共用體 union 封裝另乙個共同功能的函式 main函式預設 int sys check un un.i 1 if un.c 1 else 上面是以 1 為例判斷,以下是詳細對...
系統的大小端
比如有個十六進製制數0x12345678 為什麼用十六進製制數舉例?其實計算機只認識0和1,不管是字元還是數字,放到記憶體中後都是轉換成乙個二進位制數進行儲存,也就是一堆0和1。具體如何轉換成二進位制,和如何儲存的,就涉及到另乙個知識點了,這裡不做過多解釋 當然也可以用十進位制數,如30541989...
CPU大小端位元組序的檢測
機器的位元組序有兩種,即大端位元組序和小端位元組序。大端位元組序 在記憶體中,低位址存放資料的 高位,高位址存放資料的 低位 小端位元組序 在記憶體中,低位址存放資料的 低位,高位址存放資料的 高位 如例 定義資料 a 0x01020304 小端方式 01 02 03 04 大端方式 04 03 0...