我目前正在用C语言进行一个项目,当我试图连接一些二进制数时遇到了一些问题。

uint64_t IMM = vmicxtFetch4Byte(processor, thisPC+2);
uint64_t shiftedInstr = ((uint64_t) instr16) << 32;
uint64_t instr48 = IMM | shiftedInstr;

printf("Instr16: %x IMM: %lx Instr64: %lx\n", instr16, (unsigned long) IMM, (unsigned long) instr48);

现在,我得到的立即值(IMM)和初始指令(instr16)的输出是正确的,但是OR'd结果似乎没有给出我想要的。我想是068200000040但是
仪器16:682 IMM:40仪器64:40
我做过很多这种二进制运算,不知为什么这让我很困惑。任何想法都将不胜感激!

最佳答案

这是一个输出问题,而不是计算问题。您将转换后的值instr48转换为unsigned long,这似乎是系统上的32位类型。instr48中最重要的部分被“切掉”,因此您得到的值只包含最不重要的部分。
您应该将其转换为unsigned long long,并使用%llu格式说明符。

09-27 09:14