为什么 memcpy() 将整数目标处理为 Big Endian 而不是 char 目标?
Why does memcpy() handle integer destination as Big Endian but does not for char destination?
我的电脑运行下面的代码是小端
uint32_t src_uint = 0xAABBCCDD;
uint32_t dest_uint = 0;
uint8_t dest_arr[4] = {0};
memcpy(&dest_uint, &src_uint, 4);
printf("\ndest_uint: 0x%X\n", dest_uint);
// output: 0xAABBCCDD
memcpy(dest_arr, &src_uint, 4);
printf("\ndest_arr : 0x");
for (int i = 0; i < 4; i++)
printf("%X", dest_arr[i]);
// output: 0xDDCCBBAA
对我来说,第二个输出 (0xDDCCBBAA) 是正确的,因为我的计算机是小端。但是,第一个输出 (0xAABBCCDD) 应该改为 0xDDCCBBAA,因为 Little Endian 会将变量 src_uint
在内存中存储为:0xDDCCBBAA。似乎 memcpy() 在其参数方面不是透明的,或者 C 编译器在这些情况下以不同方式处理 int ...
谢谢!
这与 memcpy()
无关,而与您访问目的地的方式有关。在第一种情况下,您访问的值是 uint32_t
。在第二种情况下,您一次访问一个字节的内存。
在大端系统上,这些会给你相同的结果。在小端系统上,结果相反。
For me, the second output (0xDDCCBBAA) is correct because my computer is little endian.
或者换一种更具体的方式,该输出证明您的 C 实现确实使用 little-endian 表示类型 uint32_t
。
However, the first output (0xAABBCCDD) should be instead 0xDDCCBBAA since Little Endian would store variable src_uint in memory as: 0xDDCCBBAA.
这个结论不是从前提得出的。是的,src_uint
的值在内存中表示为字节序列 0xDD 0xCC 0xBB 0xAA。并且有充分的理由认为 memcpy
忠实地将字节序列复制到 dest_uint
的表示中。当您的程序将该表示解释为 uint32_t
类型的值时,结果值由 hexadecimal-reading 人表达为 0xAABBCCDD。
如果您也打印 src_uint
的值,那么您将得到相同的结果。
不要混淆数字类型对象表示的数值和这些值的 in-memory 表示。正如您所展示的,C 程序可以而且确实公开了后者,但是大多数操作都是根据前者定义的。
我的电脑运行下面的代码是小端
uint32_t src_uint = 0xAABBCCDD;
uint32_t dest_uint = 0;
uint8_t dest_arr[4] = {0};
memcpy(&dest_uint, &src_uint, 4);
printf("\ndest_uint: 0x%X\n", dest_uint);
// output: 0xAABBCCDD
memcpy(dest_arr, &src_uint, 4);
printf("\ndest_arr : 0x");
for (int i = 0; i < 4; i++)
printf("%X", dest_arr[i]);
// output: 0xDDCCBBAA
对我来说,第二个输出 (0xDDCCBBAA) 是正确的,因为我的计算机是小端。但是,第一个输出 (0xAABBCCDD) 应该改为 0xDDCCBBAA,因为 Little Endian 会将变量 src_uint
在内存中存储为:0xDDCCBBAA。似乎 memcpy() 在其参数方面不是透明的,或者 C 编译器在这些情况下以不同方式处理 int ...
谢谢!
这与 memcpy()
无关,而与您访问目的地的方式有关。在第一种情况下,您访问的值是 uint32_t
。在第二种情况下,您一次访问一个字节的内存。
在大端系统上,这些会给你相同的结果。在小端系统上,结果相反。
For me, the second output (0xDDCCBBAA) is correct because my computer is little endian.
或者换一种更具体的方式,该输出证明您的 C 实现确实使用 little-endian 表示类型 uint32_t
。
However, the first output (0xAABBCCDD) should be instead 0xDDCCBBAA since Little Endian would store variable src_uint in memory as: 0xDDCCBBAA.
这个结论不是从前提得出的。是的,src_uint
的值在内存中表示为字节序列 0xDD 0xCC 0xBB 0xAA。并且有充分的理由认为 memcpy
忠实地将字节序列复制到 dest_uint
的表示中。当您的程序将该表示解释为 uint32_t
类型的值时,结果值由 hexadecimal-reading 人表达为 0xAABBCCDD。
如果您也打印 src_uint
的值,那么您将得到相同的结果。
不要混淆数字类型对象表示的数值和这些值的 in-memory 表示。正如您所展示的,C 程序可以而且确实公开了后者,但是大多数操作都是根据前者定义的。