基本上是标题。我在MIPS ISA中有一个负数,我想使其为正-实现它的最佳方法是什么?我会改变符号位吗?不能完全确定在这里走哪条路线。
在上下文中,我试图将其除以2以将数字减小到1,但是如果数字为负数是不可能的,所以我想先使其为正数以实现此目的。
答案 0 :(得分:2)
我想提供一些其他信息(因为 Jester 已经给出了正确的答案):
我是否更改符号位或其他内容?
存储负数的方式有多种:
二进制补码
这是最常见的整数存储方式,因为在大多数CPU(包括MIPS)上,整数运算(例如加法,减法)在使用二进制补码时会自动给出正确的结果。
一个人的补语
这种存储数字的方式通常用于Internet协议(IPv4,TCP,UDP ...)的校验和计算规则中。
绝对值和符号位
浮点数通常以这种方式存储。
当然,您需要执行的操作取决于您要处理的数字类型。
如何使MIPS中的负数为正数?
负数存储为二进制补码(最有可能用于整数):
正如 Jester 所写:用0-x
计算subu $v0, $zero, $a0
。
您正在计算Internet的校验和(一个补码):
在这种情况下,您必须将所有位取反。 MIPS上最好的选择是nor $v0, $zero, $a0
。
您可以改为x xor (-1)
或(-1)-x
。在MIPS CPU上,值(-1)可以由一条subiu
指令生成。 (但是xori
立即使用无符号0..65535。)
您正在通过使用整数指令处理浮点数,并且想要反转符号:
在这种情况下,您必须更改符号位。
这是通过x xor 0x80000000
完成的。
在MIPS CPU上,可以使用一条lui
指令生成常数0x80000000。
(如果您的CPU没有浮点支持,则必须执行此操作,并且必须使用整数运算来模拟浮点运算。如果您的CPU具有浮点支持,则通常不会这样做。但是,如果您首先使用mfc1
将浮点寄存器复制到整数寄存器,然后在操作之后使用mtc1
将值复制回整数,则也可以执行此操作。感谢 @Alain Merigot 作为注释。)
您有一个支持浮点的MIPS CPU或MIPS模拟器,并且想否定一个浮点数:
您可以使用指令neg.s
(32位浮点数)或neg.d
(64位浮点数)取反数字。
对于整数输入https://godbolt.org/z/ca2nUE,请查看MIPS GCC对所有这三种方法的作用。