为什么memcpy()将整数目标作为Big-Endian处理,而不将字符目标作为Big-Endian处理?

为什么memcpy()将整数目标作为Big-Endian处理,而不将字符目标作为Big-Endian处理?,c,endianness,C,Endianness,我运行以下代码的计算机是Little Endian 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, &s

我运行以下代码的计算机是Little Endian

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
uint32\u t src\u uint=0xAABBCCDD;
uint32目的地uint=0;
uint8_t dest_arr[4]={0};
memcpy(&dest\u uint,&src\u uint,4);
printf(“\n目标:0x%X\n”,目标);
//输出:0xAABBCCDD
memcpy(目的地和目的地,4);
printf(“\ndest\u arr:0x”);
对于(int i=0;i<4;i++)
printf(“%X”,目的地[i]);
//输出:0xDDCCBBAA
对我来说,第二个输出(0xDDCCBBAA)是正确的,因为我的计算机是little endian。但是,第一个输出(0xAABBCCDD)应该是0xDDCCBBAA,因为Little Endian将变量
src_uint
存储在内存中为:0xDDCCBBAA。似乎要么memcpy()的参数不透明,要么C编译器在这些情况下以不同的方式处理int


谢谢大家!

不是关于
memcpy()
而是关于如何访问目的地。在第一种情况下,您以
uint32\u t
的形式访问该值。在第二种情况下,每次访问内存一个字节

在大端系统上,这些将给你相同的结果。在小端系统上,结果是相反的

对我来说,第二个输出(0xDDCCBBAA)是正确的,因为我的计算机是little endian

或者换一种更具体的方式说,该输出证明您的C实现确实对类型
uint32\u t
使用了小端表示

但是,第一个输出(0xAABBCCDD)应该是0xDDCCBBAA,因为Little Endian将变量src_uint存储在内存中为:0xDDCCBBAA

这一结论并非来自于先例。是的,
src_uint
的值在内存中表示为字节序列0xDD 0xCC 0xBB 0xAA。有充分的理由认为
memcpy
忠实地将该字节序列复制到
dest\u uint
的表示中。当您的程序将该表示解释为类型为
uint32\u t
的值时,结果值由十六进制读取器表示为0xAABBCCDD

如果您也打印
src_uint
的值,则会得到相同的结果


不要混淆由数值类型的对象表示的数值和这些数值的内存表示形式。正如您所演示的,C程序可以并且确实公开了后者,但大多数操作都是根据前者定义的。

将cast
&dest\u uint
类型转换为
uint8\u t*
,然后一次打印一个字节。在这里,我看不到与big-endian相关的内容0xAABBCCDD是0xAABBCCDD big或little-endian,int将显示0xAABBCCDD。在某些系统上,第二个将是或至少可以是0xDDCCBBAA,但您有在做出这样的假设之前检查处理程序文档。big-endian不符合单一的全球标准。对此也不会有什么影响。99%的时候,当提到endian时,它被不正确地使用/假定。
memcpy
复制顺序字节,不管它们代表什么。它没有结束的概念,在张贴的问题中也没有任何其他建议。