c 中的位移位返回错误的结果

bit shifting in c returning wrong result

我正在编写代码来翻译机器代码。 readFiveBytes 在一个循环内,应该一次获取一个字节并将每个字节放入正确的位置,最后 return 一个地址。

void readFiveBytes(int c) {
    if (counter != 0) {
        currentIns = currentIns | (c << (counter * 4));
        printf("reading byte: %X; address: %08X; counter: %d; type: 5\n",c, currentIns, counter);
        counter = counter - 2;
    } else {
        currentIns = currentIns | c;
        printType3(currentIns);
        printf("reading byte: %X; address: %08X; counter: %d; type: 5\n",c, currentIns, counter);
        currentIns = 0x00000000000000;
        isFinishReading = true;
    }
}   

输出是

reading byte: 71; address: 00000071; counter: 8; type: 5
reading byte: 26; address: 26000071; counter: 6; type: 5
reading byte: 0; address: 26000071; counter: 4; type: 5
reading byte: 0; address: 26000071; counter: 2; type: 5
reading byte: 0; address: 26000071; counter: 0; type: 5 

我想知道为什么第一个字节没有移到最左边? (好像第二个效果不错)

移动位宽或更多是未定义的行为。

第一关,counter = 8 次尝试 currentIns = currentIns | (c << 32);。假设 currentIns 是一个 32 位整数,这是未定义的行为。

在这种情况下,典型的未定义行为只是发生 (counter * 4)%32 的移位。对于 counter = 8,这是 0 的移位。