C语言右移结果出错?

Solomon1588 2015-10-25 02:17:13
如题,我在取指令码中的寄存器号时用到掩码和右移,但是右移结果出错了。如下图:





unsigned long long INSN_LD(unsigned long long *pc){
*regFile.ir = (long long)(*( unsigned int *)(memBlock.memBase + *pc)); // 取指令

unsigned int rsNum = (*regFile.ir); // 截断long long 型数据低32位
printf("rsNum %x", rsNum);
rsNum = rsNum & RS_MASK;
rsNum = rsNum >> RS_RIGHT_SHIFT; // 右移21位
printf("rsNum %x", rsNum);// 指令与掩码按位与,取寄存器RS的号码。
printf("%x", rsNum);
unsigned short immediate = (unsigned short)(*regFile.ir); // 小端机,取指令的低2字节,就是偏移量。
int address = regFile.regBase[rsNum] + immediate; // 数据地址

unsigned int rtNum = *(unsigned int*)(*regFile.ir) >> RT_RIGHT_SHIFT; // 右移16位RT寄存器号
rtNum = rtNum & REG_NUM_MASK; // 目的寄存器号

regFile.regBase[rtNum] = *(long long *)(memBlock.memBase + address);
*pc += 4; // pc指向下一条指令的地址
return *pc;
}
...全文
252 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
qldsrx 2015-10-28
  • 打赏
  • 举报
回复
从结果来说,这个结果是完全正确的,并没有任何错误。 你的rsNum在掩码处理后的值为50331648,右移21位就好比除以2的21次方,你用计算器试下,结果就是24.
赵4老师 2015-10-26
  • 打赏
  • 举报
回复
仅供参考:
#include <stdio.h>
unsigned short int ui;
  signed short int si;
int main() {
    ui=(unsigned short int)0x8000u;
    si=(  signed short int)0x8000;
    printf("ui=%u\n",ui);
    printf("si=%d\n",si);
    ui=ui>>1;
    si=si>>1;
    printf("ui=%u\n",ui);
    printf("si=%d\n",si);

    printf("--------------\n");
    ui=(unsigned short int)0x8000u;
    si=(  signed short int)0x8000;
    printf("ui=%u\n",ui);
    printf("si=%d\n",si);
    ui=((  signed short int)ui)>>1;
    si=((unsigned short int)si)>>1;
    printf("ui=%u\n",ui);
    printf("si=%d\n",si);

    return 0;
}
//ui=32768
//si=-32768
//ui=16384
//si=-16384
//--------------
//ui=32768
//si=-32768
//ui=49152
//si=16384

69,368

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧