晚上好。我试图弄清楚如何确定整数是否符合MIPS中的16位整数。
我理解2 ^ 15-1 = 32767或2 ^(16-1)-1 = 32767并且我们想要二进制数的16位值。无论如何,我试图确定整数是否通过了测试。我写了这个:
addi $s3, $zero, 32767
bgt $t2, $s3, else #branch to else if t2>s3
move $v0, $t2 #if no overflow; place t2 in v0
addi $v1, $zero, 0 #if no overflow; place zero in v1
else:
addi $v0, $zero, 0 #if overflow; place 0 in v0
addi $v1, $zero, -1 #if overflow; place -1 in v1
无论如何,当我尝试评估负数时,我的逻辑存在问题。我明天有工作到期。我正在学习MIPS编程。我不是一个编程势利者,所以任何有用的建议都是值得欣赏的。谢谢你的时间。
答案 0 :(得分:0)
这对你来说太迟了 1 。
如果编码为32位二进制补码数的 N 数字可以是 a ,则有点不清楚如果32位数字可以编码为16位数字,也可以编码为16位二进制补码或者如果要测试 b)。
对于 b),您只需要测试是否设置了高于16的位:
#Assume $t0 is the number to test
lui $t1, 0xffff #$t1 = 0xffff0000
and $t1, $t1, $t0 #$t1 is zero if all higher bits of $t0 are zero
beq $t1, $0 fits16bits #Jump to label if fits
#Here the number doesn't fit 16 bits
对于 a)的情况,关键是要理解,就像数字0x00f1和数字0x0000000f1一样,前导零不重要,数字0xffff和数字0xffffffff是两个补码中的数字相同(数字-1)。
要将16位二进制补码扩展为32位,我们需要执行符号扩展,即复制上层原始数字的最高位(符号位) 16位。
因此0x7fff变为0x00007fff,0xc000变为0xffffc0000。
测试所有高17位相等的一种简单方法是将它们算术右移,这样如果它们实际上相等,我们最终会得到0x00000000或0xffffffff。
sra $t1, $t0, 15 #Shift right 16 bits duplicanting the MSb
beqz $t1, $0, fits16bits #Jump to label if fits (All zero)
addiu $t1, 1 #Add 1
beqz $t1, $0, fits16bits #Jump to label if fits (Before +1 was all ones)
#Here the numbers doesn't fit
1 也许这样做会更好。