C語言大小端問題

2021-10-12 06:55:49 字數 2913 閱讀 9072

一、概念

大端儲存:乙個數的低位位元組序的內容存放到高位址處,高位位元組序的內容存放在低位址處。

小端儲存:乙個數的低位位元組序的內容存放到低位址處,高位位元組序的內容存放在高位址處。

舉個例子:

#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 後來計算...