用c語言寫程式時需要知道是大端模式還是小端模式。
所謂的大端模式(be big-endian),是指資料的低位儲存在記憶體的高位址中,而資料的高位,儲存在記憶體的低位址中(低對高,高對高)。最直觀的位元組序,因為不要考慮對應關係 只需要把記憶體位址從左到右按照由低到高的順序寫出,把值按照通常的高位到低位的順序寫出,兩者對照,乙個位元組乙個位元組的填充進去。
所謂的小端模式(le little-endian),是指資料的低位儲存在記憶體的低位址中,而資料的高位儲存在記憶體的高位址中(低對低,高對高)。最符合人的思維的位元組序,因為從人的第一觀感來說,低位值小,就應該放在記憶體位址小的地方,也即記憶體位址低位。反之,高位值就應該放在記憶體位址大的地方,也即記憶體位址高位
為什麼會有大小端模式之分呢?這是因為在計算機系統中,我們是以位元組為單位的,每個位址單元都對應著乙個位元組,乙個位元組為8bit。但是在c語言中除了8bit的char之外,還有16bit的short型,32bit的long型(要看具體的編譯器),另外,對於位數大於8位的處理器,例如16位或者32位的處理器,由於暫存器寬度大於乙個位元組,那麼必然存在著乙個如果將多個位元組安排的問題。因此就導致了大端儲存模式和小端儲存模式。
在實際程式設計中,我們可能會遇到判斷乙個平台是大端的,還是小端的。下面總結了幾個常見的判斷思路。
思路一:聯合體union的存放順序是所有成員都從低位址開始存放,利用該特性就可以輕鬆地獲得了。
cpu對記憶體採用little-endian還是big-endian模式讀寫:
int checkcpu( )
c;c.a = 1;
return(c.b ==1);}}
思路二:利用資料型別轉換的截斷特性:
int i = 0x00000001;
if(*(char*)&i)
puts("little");
else
puts("big);
思路三:在linux核心中實現的方法:
static union
endian_test = };
#define endianness((char)endian_test.l)
機器大小端
這是因為在計算機系統中我們是以位元組為單位的,每個位址單元都對應著乙個位元組,乙個位元組為8bit。但在c語言中除了8bit的char之外,還有16bit的short型,32bit的long型 要看具體的編譯器 另外,對於位數大於8位的處理器,例如16位或者32位處理器,由於暫存器寬度大於乙個位元組...
大小端機器的判定
所謂的 大端模式 是指資料的低位 就是權值較小的後面那幾位 儲存在記憶體的高位址中,而資料的高位,儲存在記憶體的低位址中,這樣的儲存模式有點兒類似於把資料當作字串順序處理 位址由小向大增加,而資料從高位往低位放 所謂的小端模式 是指資料的低位儲存在記憶體的低位址中,而數 據的高位儲存在記憶體的高位址...
判斷機器的大小端
一 概念 大端模式 big endian 是指資料的低位儲存在記憶體的低位址中,而數 據的高位儲存在記憶體的高位址中。為什麼會有大小端模式之分呢?這是因為在計算機系統中,我們是以位元組為單位的,每個位址單元都對應著乙個位元組,乙個位元組為8bit。但是在c語言中除了8bit的char之外,還有16b...