2

我有以下代码:

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。

4

3 回答 3

4

您显然是在“小端”机器上运行它,其中最低有效字节排在第一位。请参阅http://en.wikipedia.org/wiki/Endianness

于 2011-11-22T00:19:01.523 回答
1

您的平台在较小的内存地址存储数字的较低有效字节,而在较高的内存地址存储更多有效字节。这样的平台被称为小端平台。

但是,当您打印一个数字时,首先打印更重要的数字,而稍后打印更低的有效数字(这就是我们日常数字符号的工作方式)。由于这个原因,与它在 little-endian 平台上存储在内存中的方式相比,结果看起来“颠倒了”。

如果您在big-endian平台上编译并运行相同的程序,则输出应该是4142(假设平台为 2-byte short)。

PS 有人可以争辩说,这种情况下的“问题”是我们日常数字符号的“怪异”:我们写数字时,数字的重要性从右到左增加。这在以从左到右方向书写和阅读的社会的背景下似乎是不一致的。换句话说,它不是在小端内存中被反转。我们写数字的方式是颠倒的。

于 2011-11-22T00:22:11.267 回答
0

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

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

void main() 
{ 
    char tmp[5]= "ABCD"; 
    int k; 
    memcpy(&k,tmp,4); 
    printf("%x\n", k); 
} 
于 2011-11-22T00:20:23.123 回答