一、概念
大端儲存:乙個數的低位位元組序的內容存放到高位址處,高位位元組序的內容存放在低位址處。
小端儲存:乙個數的低位位元組序的內容存放到低位址處,高位位元組序的內容存放在高位址處。
舉個例子:
#include
#include
#include
intmain()
//printf("%s \n", isbigendian() ? "big" : "small");
return
0;
以上**中,宣告了乙個int型變數a,佔4個位元組,列印的結果為:
[
0x7ffec1d68aa1][
0][0x1][
0x7ffec1d68aa2][
1][0
][0x7ffec1d68aa3][
2][0
][0x7ffec1d68aa4][
3][0
]
a的值是1 ,在記憶體中儲存應該是0x 00 00 00 01才對啊,為什麼編譯器給出的卻是0x 01 00 00 00?
因為執行該**的計算機是小端模式,即資料的低位位元組存放在低位址。一般常用的裝置大多都是小端模式。
二、判斷方法
根據以上知識,可以利用資料低位址的資料判斷裝置的大小端模式
char
isbigendian()
else
}
先初始化乙個unsigned int 型別的變數dwval,dwval占用四個位元組,再用unsigned char強轉,此時的強轉會擷取dwval的最低位址的那個位元組。若低位址儲存的是12,說明低位址存放高位元組,即大端模式,反之低位址存放低位元組34,即小端模式。
三、相關問題
在資料通訊過程中,資料儲存在char型陣列中,若想把資料轉為int型,需要確定儲存在char型陣列中的順序是否為小端模式,若不是小端模式,可通過位操作轉為小端,只有小端模式,才能使用memcpy4位元組到int型資料的位址,如下
int nval;
char c[4]
;memset
(c,0,4
);c[0]=
0x12
; c[1]
=0x34
; c[2]
=0x56
; c[3]
=0x78
;//轉為int後從高位址到低位址 0x78 0x56 0x34 0x12
memcpy
(&nval,c,4)
;//nval = 2018915346
再記乙個無關的問題,int與float型別強轉會出現精度丟失,今天嘗試float直接強轉為int,個位數出現偏差。查閱網上資料表明,一般浮點與整型的強轉用double。在64位計算機上,我是用long強轉了double後,再賦值給了int,資料顯示正常。
2023年1月16日更新
在使用char陣列往short陣列拷貝資料時候發現乙個問題,short陣列中的資料高低位元組交換了,這裡面還是涉及到了記憶體位址與資料高低位元組問題。假設char陣列在記憶體中由低位址到高位址的存放順序為:
0x1 0x2 0x3 0x4 0x5 0x6
然後把這6個位元組直接拷貝到short陣列中,在short陣列中,資料存放還是這個順序:
0x1 0x2 0x3 0x4 0x5 0x6
但是,當把資料按short型讀取出來時,就不一樣了,假設short陣列為awval,每個short型別資料佔2個位元組,所以對應awval陣列在記憶體中的資料就是:
awval[0]:0x1 0x2
awval[1]:0x3 0x4
awval[2]:0x5 0x6
以awval[0]舉例,以short型別讀取後,因為是小端裝置,資料的低位元組存放在低位址,高位元組存放在高位址,所以awval[0]的值為0x201,這也就解釋了高低位元組交換的現象。可以通過下**證實高低位元組交換問題,若實際應用需要把char型陣列資料拷貝到shrot型,可提前進行高低位元組交換後再拷貝;若是拷貝到int型陣列,則需要先交換高低字,再交換高低位元組。
#include
#include
intmain()
;char achval=
;int i;
printf
("\nachval:\n");
for(i =
0; i <
sizeof
(achval)
; i++
)memcpy
(awval, achval,
sizeof
(achval));
p =(char
*)awval;
printf
("\np:\n");
for(i =
0; i <
sizeof
(achval)
; i++
)printf
("\nawval:\n");
for(i =
0; i <
4; i++
)printf
("\n\n");
return0;
}
列印結果為:
achval:
0x1 0x2 0x3 0x4 0x5 0x6
p: 0x1 0x2 0x3 0x4 0x5 0x6
awval:
0x201 0x403 0x605 0
C語言 大小端的問題
在計算機中資料一般都先存在記憶體中,拿32位機來說 系統為記憶體的每乙個位置都分配了乙個位址.位址 從0x00000000開始到0xffffffff 也許你的記憶體沒這麼大 那麼對於小端 little endain 來說,資料0x12345678在記憶體中的映像就是這個樣子的 78 0x000000...
C語言大小端問題剖析
在c語言中,常常會遇到判斷cpu大小端的問題,在很多的筆試面試中經常會出現類似的題目,網路程式設計中也會程序遇到類似的問題,此文做以總結。1 那麼何為cpu的大端和小端呢?大端 指的是資料的高位元組存放在記憶體的低位址中,資料的低位元組存放在記憶體的高位址中 小端 指的是資料的高位元組存放在記憶體的...
C語言之大小端問題
1 大小端名字的由來及發展 1 在喬納森 斯威夫特的著名諷刺 格列夫遊記 中,小人國內部 成big endian和little endian兩派,區別在於一派要求從雞蛋的大頭把雞蛋打破,另一派要求從雞蛋的小頭把雞蛋打破。斯威夫特藉以諷刺英國的政黨之爭,在計算機工業中指資料儲存順序的分歧。2 後來計算...