You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何反转endianness?求助理解C语言实现endianness反转的代码逻辑

大小端反转的核心逻辑

大小端本质是多字节数据在内存中的字节存储顺序不同,反转endianness就是把多字节数据的字节顺序完全倒转。比如4字节的int原内存字节序为字节0 字节1 字节2 字节3,反转后变为字节3 字节2 字节1 字节0。

代码逻辑拆解

你贴的完整实现代码如下:

int reverse_endianess(int value) {
    int resultat = 0;
    char *source, *destination;
    int i;

    source = (char *) &value;
    destination = ((char *) &resultat) + sizeof(int);
    for (i = 0; i < sizeof(int); i++)
        *(--destination) = *(source++);
    return resultat;
}

这段代码的核心思路是把int类型的内存空间按字节逐个逆序拷贝,强转char*的原因是char指针的步长为1字节,移动时只会偏移1字节,刚好可以逐个操作int的每一个字节。

你不理解的代码片段逐行解释

destination = ((char *) &resultat) + sizeof(int);
for (i = 0; i < sizeof(int); i++)
    *(--destination) = *(source++);

我们以32位系统、sizeof(int) = 4的常见场景举例,逻辑非常好理解:

  • source是指向输入参数value首字节的char指针,每次+1就往后走1字节,刚好按顺序取value的第0、1、2、3个字节
  • ((char *) &resultat)是存储结果的变量resultat的首字节(低地址),加sizeof(int)也就是加4之后,destination就指向了resultat内存空间最后一个字节的下一个地址,也就是超出resultat最高地址1字节的位置
  • 循环每次执行时先给destination减1,刚好就落到resultat的第3、2、1、0个字节的位置
  • 赋值操作就是把value按正序取出来的字节,倒着填到resultat的内存空间里

举个实际数值示例:假设输入int为0x12345678,小端存储下value的内存按地址从低到高存储为0x78 0x56 0x34 0x12

  1. 第一次循环:destination减1指向resultat最高地址,赋值0x78
  2. 第二次循环:destination减1指向次高地址,赋值0x56
  3. 第三次循环:destination减1指向次低地址,赋值0x34
  4. 第四次循环:destination减1指向最低地址,赋值0x12

最终resultat的内存为0x12 0x34 0x56 0x78,读出来就是0x78563412,刚好完成大小端反转。

内容的提问来源于stack exchange,提问作者user16986383

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 20:09:02