C Union 中的 Endian Swap

Endian Swap in C Union

我想了解在 C 的联合内完成字节序交换的工作方式。我知道联合能够保存多种类型的数据,但一次只能保存一种类型。我试图理解的代码看起来像这样,这是联合定义:

  union byte4 {
          char byte[4];
          int numint;
          float numfloat;
  };

这是函数。

  int endianSwap4int(int a) {
      union byte4 un;
      un.numint = a;

      // swap
      char c1 = un.byte[0];
      un.byte[0] = un.byte[3];
      un.byte[3] = c1;
      c1 = un.byte[1];
      un.byte[1] = un.byte[2];
      un.byte[2] = c1;

      return un.numint;
  }

函数中,如果输入a为2048327680,返回un.numint时函数returns6010。我知道操纵 un.byte 也是间接操纵 un.numint 因为工会一次只能持有一件事,但我不明白它们是如何相互影响的,所以我的问题是,究竟如何它们相互影响吗?

如果您查看 2048327680 的十六进制表示,您会发现它是 7A 17 00 00。因此,如果您的机器以小端格式存储此值,则首先存储 LSB。

如果我们给endianSwap4int添加额外的调试如下:

  int endianSwap4int(int a) {
      union byte4 un;
      int i;
      un.numint = a;

      printf("before:\n");
      for (i=0;i<4;i++) {
          printf("un[%d]=%02X\n", i, un.byte[i]);
      }

      // swap
      char c1 = un.byte[0];
      un.byte[0] = un.byte[3];
      un.byte[3] = c1;
      c1 = un.byte[1];
      un.byte[1] = un.byte[2];
      un.byte[2] = c1;

      printf("after:\n");
      for (i=0;i<4;i++) {
          printf("un[%d]=%02X\n", i, un.byte[i]);
      }
      return un.numint;
  }

您将看到以下输出:

before:
un[0]=00
un[1]=00
un[2]=17
un[3]=7A
after:
un[0]=7A
un[1]=17
un[2]=00
un[3]=00

这里可以看到交换前原数的LSB在前,交换后原数的MSB在前。所以现在联合的 int 部分包含值 00 00 17 7A,十进制为 6010.