MIPS中用NOR实现逻辑非时,1 NOR 1得到-2是否正常?
在MIPS中用NOR实现逻辑非得到负数结果是否正常?
是的,这个结果完全正常,核心原因是MIPS的nor指令是按位操作,而非你可能预期的布尔型逻辑非。
具体拆解:
MIPS是32位架构,所有寄存器默认存储32位数据:
- 当你执行
nor $t1, $t1, $t1时,是对寄存器的每一位单独进行NOR运算:- 若原寄存器值为
1,二进制是00000000 00000000 00000000 00000001,每一位和自身NOR后得到11111111 11111111 11111111 11111110,这在二进制补码规则下就是-2。 - 若原寄存器值为
0,按位NOR后得到全1的32位数据,对应补码的-1。
- 若原寄存器值为
关于两种“非”的差异:
如果你的需求是布尔逻辑非(把任意非0值转为0,0转为1),按位NOR的方案确实不适用。这种场景可以用分支指令实现:
beq $t1, $zero, set_non_zero # 若$t1为0,跳转到赋值1的分支 move $t1, $zero # 否则将$t1设为0 j end set_non_zero: li $t1, 1 # 将$t1设为1 end:
但多数开发者使用nor指令的场景是需要按位取反,而按位取反恰好等价于“自身NOR自身”,所以这类方案才会被广泛推荐。
内容的提问来源于stack exchange,提问作者tarski
相关产品推荐
相关产品推荐

