字节反转整数的问题

man*_*ama 2 c endianness

天哪.

有人可以解释这两个字节反转函数实现的逻辑差异.

例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;
}  
Run Code Online (Sandbox Code Playgroud)

例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;
}
Run Code Online (Sandbox Code Playgroud)

我必须遗漏一些东西,因为对于无符号整数0xFE12ADCF,第一个例子正确给出,0xCFAD12FE而第二个例子产生1.我错过了什么?

顺便说一句,我无法弄清楚如何在pre + code-tags中获得'<<' LSHIFT.如果可以这样做,请随时编辑(并评论如何=)).

谢谢.

编辑:修复了bytes从未分配过的-variable.

Nab*_*abb 10

|是不一样的运营商||.第一个是按位OR,这是你想要的.第二个是布尔OR,这就是你所拥有的.