2010-11-19 84 views
3

我有一個關於memcpy的問題,我希望有人可以回答。這裏是一個簡短的演示程序:無符號字符數組的C memcpy問題

#include<stdio.h> 
#include<string.h> 
#include<stdlib.h> 


int main (int argc, char **argv){ 
    unsigned char buffer[10]; 
    unsigned short checksum = 0x1234; 
    int i; 
    memset(buffer, 0x00, 10); 
    memcpy(buffer, (const unsigned char*)&checksum, 2); 
    for(i = 0; i < 10; i ++){ 
    printf("%02x",buffer[i]); 
    } 
    printf("\n"); 
    return 0; 
} 

當我運行這個程序,我得到34120000000000000000.
我的問題是,爲什麼我沒有拿到12340000000000000000?

非常感謝

+0

機器的架構是什麼? – Phong 2010-11-19 05:40:30

回答

2

little endian/big endian architecture? 這意味着2字節的校驗和被反轉。

這只是一個猜測,如果我的回答不真實評論它,我會刪除它。

+0

Endianess是一個很好的觀點,但是當我在兩臺不同的機器上運行它時,我看到了相同的結果,其中一臺是Intel P4 ant,另一臺是AMD64,我認爲它們分別是小端和大端架構。 – aarbear 2010-11-19 05:54:44

+1

AMD64也是little endian http://stackoverflow.com/questions/1024951/does-my-amd-based-machine-use-little-endian-or-big-endian – 2010-11-19 06:02:20

+0

@arbear:在SPARC上試試它。 – caf 2010-11-19 12:09:26

1

英特爾的CPU是小端,它們存儲的數字小詞第一

這顯然是證據表明,英特爾不做室內藥物測試。

+1

哈哈哈。實際上,小端沒有大端沒有的許多優點。就像基於0的索引一樣。 – 2010-11-19 05:45:36

+0

@Matt喬伊納 - 立即停止它。或者你會被送回1980年超時。 – detly 2010-11-19 06:02:41

+0

@detly:我們以前見過嗎?你有沒有注意到我的答案有一個趨勢? – 2010-11-19 15:59:46

8

由於您處於little-endian系統,您正在獲得34120000000000000000。在大端系統上你會得到12340000000000000000。 Endianness給出了一個關於big-endian和little-endian系統的完整討論。