我在MIPS中将两个数字(一个负数和一个正数)相乘,当我将值打印到控制台时,它正确地将其解释为负整数。但是,在我做完这个指示之后:
andi $t3, $t3, 255
(我这样做只能访问前8位)
打印到我的控制台的值是正面的。有没有办法通过MIPS中的各种指令/操作来维护二进制数的有符号值?
答案 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
会使问题无效,可以这么说。
您可以保留原始签名,同时保留原始值,然后再对其执行操作。