我有以下代码:
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。
您显然是在“小端”机器上运行它,其中最低有效字节排在第一位。请参阅http://en.wikipedia.org/wiki/Endianness。
您的平台在较小的内存地址存储数字的较低有效字节,而在较高的内存地址存储更多有效字节。这样的平台被称为小端平台。
但是,当您打印一个数字时,首先打印更重要的数字,而稍后打印更低的有效数字(这就是我们日常数字符号的工作方式)。由于这个原因,与它在 little-endian 平台上存储在内存中的方式相比,结果看起来“颠倒了”。
如果您在big-endian平台上编译并运行相同的程序,则输出应该是4142
(假设平台为 2-byte short
)。
PS 有人可以争辩说,这种情况下的“问题”是我们日常数字符号的“怪异”:我们写数字时,数字的重要性从右到左增加。这在以从左到右方向书写和阅读的社会的背景下似乎是不一致的。换句话说,它不是在小端内存中被反转。我们写数字的方式是颠倒的。
你的系统是小端的。这意味着short
(16 位整数)首先存储最低有效字节,然后是最高有效字节。
对于较大的整数也是如此。以下代码将导致“44434241”。
void main()
{
char tmp[5]= "ABCD";
int k;
memcpy(&k,tmp,4);
printf("%x\n", k);
}