我有以下代码:
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.
答案 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);
}