MIPS关于有符号位的指令

时间:2016-11-27 03:38:35

标签: mips

我在MIPS中将两个数字(一个负数和一个正数)相乘,当我将值打印到控制台时,它正确地将其解释为负整数。但是,在我做完这个指示之后:

andi $t3, $t3, 255 

(我这样做只能访问前8位)

打印到我的控制台的值是正面的。有没有办法通过MIPS中的各种指令/操作来维护二进制数的有符号值?

1 个答案:

答案 0 :(得分:0)

不,不是这样(即and)。

负数具有MSB集(即0x80000000)。当你执行andi时,你会失去这一点(即破坏它)。

考虑-1,即0xFFFFFFFF。当你和255(0x000000FF)时,得到0x000000FF,即小数点后的255。

考虑-2,即0xFFFFFFFE。当您和255(0x000000FF)对比时,您得到0x000000FE,即小数点后的254。

如果你有签名 char [在C中],则范围是-128(0x80)到127(0x7F)。

你可以用以下方式签名扩展:

    sll     $t3,$t3,24              # force sign bit of byte into sign of word
    sra     $t3,$t3,24              # sign extend the register

但是,这仅适用于signed char值的范围。例如,如果您最初有511(0x000001FF)并且这样做,那么您最终会得到-1,这是不正确的。

所以,实际上,做andi会使问题无效,可以这么说。

您可以保留原始签名,同时保留原始值,然后再对其执行操作。