【发布时间】:2018-10-12 19:43:41
【问题描述】:
我对此有疑问,我正在尝试使用memcpy() 将string[9] 复制到unsigned long long int 变量,这是代码:
unsigned char string[9] = "message";
string[8] = '\0';
unsigned long long int aux;
memcpy(&aux, string, 8);
printf("%llx\n", aux); // prints inverted data
/*
* expected: 6d65737361676565
* printed: 656567617373656d
*/
如何在不反转数据的情况下制作此副本?
【问题讨论】:
-
这就是
unsigned long long int存储其数据的方式。你无法改变这一点。如果你想以不同的顺序存储它,你需要在复制之前重新排列数据,或者在复制之后移动位。 -
你的机器是Little Endian。
-
或者如果只是打印,使用
%02hhx打印字符串中的单个字符。 -
在学习 C 之前,您应该了解每个系统都有一个整数的内部表示(字节序、填充字节、符号表示、陷阱等)。哎呀,
unsigned long long int可能是 4 个字节(其中CHAR_BIT是 16,char是 16 位,因此字节也是如此,C 允许这样做)......在这里您正在将 8 复制到其中...您正在涉足未定义的行为,这可能意味着您可以使用一本书来指导您避免编写不可移植、不稳定且难以调试的代码。