You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在MIPS中实现2的补码运算并输出十进制、二进制、十六进制值

MIPS 16位整数补码运算实现

我们要处理的是16位整数的补码,所以首先要把输入的32位整数截断到16位有效位,再按「按位取反 + 加1」的规则计算补码,最后分别打印三种格式的结果即可。

你现有代码的修正点:

  • 修复数据段中twoCompHex字符串的换行符错误,原代码把\n写成了/n
  • 新增16位掩码做高位截断,避免32位寄存器的高位干扰补码计算
  • 补全补码的计算逻辑和对应打印代码

完整可运行代码如下:

.data
    int: .word 0
    prompt: .asciiz "请输入一个16位整数: "
    msgDec: .asciiz "\n你输入的十进制数: " 
    msgBin: .asciiz "\n你输入的二进制数: "
    msgHex: .asciiz "\n你输入的十六进制数: " 
    
    twoComp: .asciiz "\n对应补码的十进制值: " 
    twoCompBin: .asciiz "\n对应补码的二进制值: " 
    twoCompHex: .asciiz "\n对应补码的十六进制值: "
    # 16位掩码,用于截断高位
    mask_16: .word 0x0000ffff
    
.text
    # 输出提示语
    li $v0, 4
    la $a0, prompt
    syscall
    # 读取用户输入的整数
    li $v0, 5
    syscall
    move $t0, $v0
    
    # 打印原数十进制
    li $v0, 4
    la $a0, msgDec
    syscall
    li $v0, 1 
    move $a0, $t0
    syscall
    
    # 打印原数二进制 
    li $v0, 4
    la $a0, msgBin
    syscall
    move $a0, $t0
    li $v0,35
    syscall
    
    # 打印原数十十六进制
    li $v0, 4
    la $a0, msgHex
    syscall
    move $a0, $t0
    li $v0,34
    syscall
    
    # 计算16位补码
    lw $t3, mask_16
    # 先截断到16位,清除高位无效值
    and $t0, $t0, $t3
    # 按位取反
    not $t1, $t0
    # 取反后也截断到16位
    and $t1, $t1, $t3
    # 加1得到补码
    addi $t2, $t1, 1
    # 补码结果截断到16位
    and $t2, $t2, $t3
    
    # 打印补码十进制
    li $v0, 4
    la $a0, twoComp
    syscall
    li $v0, 1
    move $a0, $t2
    syscall
    
    # 打印补码二进制
    li $v0, 4
    la $a0, twoCompBin
    syscall
    move $a0, $t2
    li $v0, 35
    syscall
    
    # 打印补码十六进制
    li $v0, 4
    la $a0, twoCompHex
    syscall
    move $a0, $t2
    li $v0, 34
    syscall
    
    # 程序退出
    li $v0, 10
    syscall

如果需要将补码作为有符号16位数输出十进制,只需要在打印补码十进制前加两行指令sll $t2, $t2, 16、sra $t2, $t2, 16,把16位的有符号值扩展到32位,系统调用打印十进制时就会输出带符号的结果。

内容的提问来源于stack exchange,提问作者Chuzzz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 19:18:03