大家好。
请问有谁能够解释一下这两个字节反转函数实现的逻辑区别。
示例1:
uint32_t byte_reverse_32(uint32_t num) {
static union bytes {
uint8_t b[4];
uint32_t n;
} bytes;
bytes.n = num;
uint32_t ret = 0;
ret |= bytes.b[0] << 24;
ret |= bytes.b[1] << 16;
ret |= bytes.b[2] << 8;
ret |= bytes.b[3];
return ret;
}
示例2:
uint32_t byte_reverse_32(uint32_t num) {
static union bytes {
uint8_t b[4];
uint32_t n;
} bytes;
bytes.n = num;
uint32_t ret = 0;
ret |= (bytes.b[0] << 24) || (bytes.b[1] << 16) || (bytes.b[2] << 8) || (bytes.b[3]);
return ret;
}
我可能漏掉了什么,因为对于无符号整数
0xFE12ADCF
,第一个示例正确地给出了0xCFAD12FE
,而第二个示例则产生了1
。我错过了什么?顺便说一下,我无法弄清如何在pre+code标签中获取'<<',因此使用了
LSHIFT
。如果可以做到,请随意编辑(并评论如何实现)。谢谢。
编辑:修复了从未分配的
bytes
变量。
<<
等内容。 - cafbytes.n
。但更好的方法是初始化而不是赋值。正如paercebal所说,去掉static
属性,然后使用= { .n = num }
初始化变量。 - Jens Gustedtstatic
存储说明符,它会使你的代码非常不可重入。static
没有const
几乎总是一个错误。 - R.. GitHub STOP HELPING ICE