gpt4 book ai didi

c - C Union 中的 Endian Swap

转载 作者:太空宇宙 更新时间:2023-11-03 23:44:28 25 4
gpt4 key购买 nike

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

  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时函数返回6010。我知道操纵 un.byte 也是间接操纵 un.numint 因为 union 一次只能容纳一件事,但我不明白它们到底是如何影响的彼此,所以我的问题是,它们究竟是如何相互影响的?

最佳答案

如果您查看 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在前。所以现在 union 的 int 部分包含值 00 00 17 7A,十进制为 6010

关于c - C Union 中的 Endian Swap,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37304481/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com