2010-11-19 88 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系统的完整讨论。