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
的移位。
我正在编写代码来翻译机器代码。 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
的移位。