请帮我在C中使用memcpy()

时间:2011-11-22 00:16:25

标签: c string hex memcpy short

我有以下代码:

void main()
{
    char tmp[3]= "AB";
    short k;
    memcpy(&k,tmp,2);
    printf("%x\n", k);
}

在ASCII中,char'A'的十六进制值为41,char'B'的十六进制值为42.为什么该程序的结果为4241?我认为正确的结果是4142.

3 个答案:

答案 0 :(得分:4)

你显然是在“小端”机器上运行它,其中最低有效字节首先出现。请参阅http://en.wikipedia.org/wiki/Endianness

答案 1 :(得分:1)

您的平台在较小的内存地址存储较少的字节数,在较高的内存地址存储较多的字节。此类平台称为 little-endian 平台。

但是,当您打印数字时,首先打印更有效的数字,而稍后打印较低有效数字(这是我们日常数字符号的工作方式)。因此,与在小端平台上存储在内存中的方式相比,结果看起来“逆转”。

如果在 big-endian 平台上编译并运行相同的程序,则输出应为4142(假设平台为2字节short)。< / p>

P.S。人们可以争辩说,在这种情况下,“问题”是我们日常数字符号的“怪异”:我们编写数字,使其数字的重要性在从右到左的方向上增加。在从左到右的方向书写和阅读的社会中,这似乎是不一致的。换句话说,它不是反转的小端存储器。这是我们编写相反数字的方式。

答案 2 :(得分:0)

您的系统是小端的。这意味着short(16位整数)首先存储最低有效字节,然后是最高有效字节。

大整数也是如此。以下代码将导致“44434241”。

void main() 
{ 
    char tmp[5]= "ABCD"; 
    int k; 
    memcpy(&k,tmp,4); 
    printf("%x\n", k); 
}