CPU大小端位元組序的檢測

2021-07-04 03:22:04 字數 1310 閱讀 3015

機器的位元組序有兩種,即大端位元組序和小端位元組序。

大端位元組序:在記憶體中,低位址存放資料的

高位,高位址存放資料的

低位 小端位元組序:在記憶體中,低位址存放資料的

低位,高位址存放資料的

高位 如例:定義資料  a = 0x01020304

小端方式:01 02 03 04

大端方式:04 03 02 01

那麼如何判斷呢,方式如下-->

一、指標方式

**如下:

說明:在此我定義了乙個全域性變數a,方便與用objdump工具檢視程式資料段的儲存

如上,定義了乙個整形的32位寬的變數 a , 然後用字元型指標強轉後解引用並列印出值。整形是佔4個位元組的,若轉成字元型必定會丟失資料,因記憶體中資料是順序儲存的,所以強轉後解引用會取出低乙個位元組的資料,由此我們可以根據那乙個位元組的資料來判斷到底是大端位元組序還是小端。

如上程式,執行一下,如果列印的結果是4的話表明是小端位元組序,是 1 的話表示是大端位元組序

執行程式,結果如下:

列印結果為4,表明我機器的cpu的位元組序為小端模式

下面,用 objdump 工具來驗證一下,中斷中敲命令,後跟程式的可執行檔案

因為我定義的是全域性變數,所以查詢資料段的內容。在此要用到乙個資料,就是我列印的變數 a 的位址,上圖:

如上圖,a的位址是804a014 ,根據此位址找到基位址 804a00c , 向右偏移8個位元組後就是變數 a 的位址, 如紅線所示,儲存順序為04030201, 表明是小端位元組序。

二、聯合體方式

**如下:

如上圖,欲知此程式的執行結果,我們還需要了解聯合體的特性。

聯合體也叫做共用體,即它不同與結構體,它只有一片記憶體,而且片記憶體區域是聯合體中的所有成員所共享,且它的大小為聯合體中最大的那個成員所佔的空間,如上圖,則它的記憶體為4個位元組。

由於我們先給 a 賦值,則記憶體中存放的資料應為 0x00 00 00 01 , 檔用字元型的b變數從共享記憶體中取資料時只能取得低位元組的資料, 即 01 。

在此,如果是小端位元組序的話,那麼它取得的資料應該是01,如果是大端位元組序的話,那麼取得的資料應該是 00. 執行程式,結果如下:

如上圖,結果為1, 為小端位元組序。

大小端位元組序

1.大端和小端問題 大小端位元組序與硬體有關 intel x86 都是小端位元組序 總結 大端是 按照正常我們書寫的順序來儲存的 小端是 按照我們書寫順序相反的 實現 include int main putchar n printf x n a return 0 檢視輸出結果,判斷大小端位元組序 ...

位元組序 大小端

計算機的基本儲存單元是8位單位元組。多位元組資料,如4位元組的整型資料如何儲存的呢?是高位在記憶體高位元組?還是低位在記憶體高位元組?即位元組是按如何順序存放的?也就是所謂的位元組序,按照存放順序分為大端序 big endian 和小端序 little endian 記憶體位址訪問是由低位址到高位址...

大小端位元組序

計算機硬體有兩種儲存資料的方式 大端位元組序 big endian 和小端位元組序 little endian 比如十六進製制數0x0102,十六進製制每個數字佔4bit,四個數字16bit,也就是2byte,2個位元組儲存。0x0102高位位元組是0x01,低位位元組是0x02。l大端位元組序 高...