如何檢測編譯器的大小端

2021-08-08 08:13:35 字數 1424 閱讀 1912

大端模式

所謂的大端模式,是指資料的高位,儲存在記憶體的低位址中,而資料的低位,儲存在記憶體的高位址中,這樣的儲存模式有點兒類似於把資料當作字串順序處理:位址由小向大增加,而資料從高位往低位放;

小端模式

所謂的小端模式,是指資料的高位儲存在記憶體的高位址中,而數 據的低位儲存在記憶體的低位址中,這種儲存模式將位址的高低和

資料位權有效地結合起來,高位址部分

權值高,低位址部分權值低,和我們的邏輯方法一致。

為什麼會有大小端模式之分呢?這是因為在

計算機系統

中,我們是以位元組為單位的,每個位址單元都對應著乙個位元組,乙個位元組為 

8bit

。但是在c語言中除了8bit的char之外,還有16bit的short型,32bit的long型(要看具體的

編譯器),另外,對於位數大於 8位的處理器,例如16位或者32位的處理器,

由於暫存器寬度大於乙個位元組,那麼必然存在著乙個如何將多個位元組安排的問題

。因此就導致了大端儲存模式和小端儲存模式。

舉乙個例子,比如數字0x12 34 56 78在記憶體中的表示形式為:

1)大端模式:

低位址 -----------------> 高位址

0x12  |  0x34  |  0x56  |  0x78

2)小端模式:

低位址 ------------------> 高位址

0x78  |  0x56  |  0x34  |  0x12

可見,大端模式和字串的儲存模式類似

用一段**來證明

#includeint main()

byte;

struct

bit;

}jin;

jin.bit.p = 0x2;

jin.i = 0x12345678;

= 0x4;

printf("%x\n", jin.bit.k);

printf("%x\n", jin.bit.p);

printf("%x\n", jin.bit.q);

printf("%x\n", jin.bit.s);

printf("%x\n",jin.byte.j);

printf("%d\n", sizeof(jin));

system("pause");

return 0;

}

測試結果:

因為聯合體(union)中是各變數是「互斥」的——缺點就是不夠「包容」;但優點是記憶體使用更為精細靈活,也節省了記憶體空間,變數共用同乙個記憶體首位址

結果剛好和**中的0x12345678相反,所以我的編譯器是小端模式,聯合體的大小是其中變數最大的大小,所以輸出了4

vim編譯器如何設定

將下面 拷貝到 vimrc中,放在vim的安裝目錄下,這裡修改的只是我們使用者的配置檔案。set nocompatible 不使用相容模式 set nu 顯示行號 syntax on 語法高亮 set ruler 顯示標尺 set showcmd 出入的命令顯示出來,看的清楚些 set scroll...

C C 編譯器對struct大小的處理

一 什麼是對齊,以及為什麼要對齊 1.現代計算機中記憶體空間都是按照byte劃分的,從理論上講似乎對任何型別的變數的訪問可以從任何位址開始,但實際情況是在訪問特定變數的時候經常在特定的記憶體位址訪問,這就需要各型別資料按照一定的規則在空間上排列,而不是順序的乙個接乙個的排放,這就是對齊。2.對齊的作...

Java編譯器與雙鎖檢測

jre5 public class lazysingleton2 return m instance getinstance class 在上面的下劃線處會出現問題。無法保證編譯器為物件分配記憶體之後,是直接將物件的引用賦值給m instance 還是將物件初始化之後才將引用賦值給 m instan...