zoukankan      html  css  js  c++  java
  • 计算机实现32位整数加减乘除的方法

    计算机实现32位整数加减乘除的方法

    前言

    1)原码、反码、补码
    1.正数的原码、反码、补码都相同
    2.负数的反码是保留原码符号位,其他位取反;负数的补码是反码+1
    3.正数与负数相加,二进制结果符号位为1,此时是结果的补码,需要-1得出结果反码,再保留符号位取反得出结果
    
    2)乘法原理
    1.忽略两个乘数的符号位
    2.将第一个乘数分解为2阶泰勒展开式
    3.将第二个乘数在展开式的系数为1时的指数向左移位
    4.将所有移位的值相加,得出乘积的无符号值
    5.对两个乘数的符号位进行异或运算,得出符号位
    6.将符号位和无符号乘积合并,得出实际乘积
    
    3)除法原理
    1.忽略被除数和除数的符号位
    2.从左向右,在被除数中找到第一个1的位置,与除数相比较,若小于除数,则结果为0,余数为1,若大于除数,则商为1,余数为该步被减数减去除数的差值,新的被减数为本次余数后拼接新的被除数位
    3.当被除数最后一位运算完毕,将从上向下的各步结果从左向右拼接,就是最终的无符号商,最后一步的余数,是最终的无符号余数
    4.对被除数和除数的符号位进行异或运算,得出符号位
    5.将符号位和无符号结果、无符号余数进行合并,得出实际到店商和余数
    

    一、加法

    1)正常加法
    计算:13+18=31
    13
    0000 0000 0000 0000 0000 0000 0000 0000 1101
    18
    0000 0000 0000 0000 0000 0000 0000 0001 0010
    31
    0000 0000 0000 0000 0000 0000 0000 0001 1111
    
    2)结果溢出加法
    计算:2^31-1+2^31-1=2^32-2 <> -2^31-2
    2^31-1
    0111 1111 1111 1111 1111 1111 1111 1111 1111
    2^31-1
    0111 1111 1111 1111 1111 1111 1111 1111 1111
    -2^31-2
    1111 1111 1111 1111 1111 1111 1111 1111 1110
    

    二、减法

    1)被减数>减数
    计算:18-13=5
    18
    0000 0000 0000 0000 0000 0000 0000 0001 0010
    -13 原码
    1000 0000 0000 0000 0000 0000 0000 0000 1101
    -13 反码
    1111 1111 1111 1111 1111 1111 1111 1111 0010
    -13 补码
    1111 1111 1111 1111 1111 1111 1111 1111 0011
    5
    0000 0000 0000 0000 0000 0000 0000 0000 0101
    
    2)被减数<减数
    计算:13-18=-5
    13
    0000 0000 0000 0000 0000 0000 0000 0000 1101
    -18 原码
    1000 0000 0000 0000 0000 0000 0000 0001 0010
    -18 反码
    1111 1111 1111 1111 1111 1111 1111 1110 1101
    -18 补码
    1111 1111 1111 1111 1111 1111 1111 1110 1110
    -5 补码
    1111 1111 1111 1111 1111 1111 1111 1111 1011
    -5 反码
    1111 1111 1111 1111 1111 1111 1111 1111 1010
    -5 原码
    1000 0000 0000 0000 0000 0000 0000 0001 0101
    
    3)[0,2^31-1]-最小值
    计算:0-2^31=-2^31 <> 0
    0
    0000 0000 0000 0000 0000 0000 0000 0000 0000
    -2^31 原码
    1000 0000 0000 0000 0000 0000 0000 0000 0000
    -2^31 反码
    1111 1111 1111 1111 1111 1111 1111 1111 1111
    -2^31 补码
    0000 0000 0000 0000 0000 0000 0000 0000 0000
    
    0000 0000 0000 0000 0000 0000 0000 0000 0000
    

    三、乘法

    1)正数相乘
    计算:13*18=234
    13
    0000 0000 0000 0000 0000 0000 0000 0000 1101
    18
    0000 0000 0000 0000 0000 0000 0000 0001 0010
    step1:
    13=0*2^30 + 0*2^29 +...+ 1*2^3 + 1*2^2 + 0*2^1 + 1*2^0
    step2:
    0000 0000 0000 0000 0000 0000 0000 0001 0010
    +
    0000 0000 0000 0000 0000 0000 0000 0100 1000
    +
    0000 0000 0000 0000 0000 0000 0000 1001 0000
    =
    234
    0000 0000 0000 0000 0000 0000 0000 1110 1010
    
    2)负数相乘/负数正数相乘
    计算:-13*(-18)=234
    -13
    1000 0000 0000 0000 0000 0000 0000 0000 1101
    13
    0000 0000 0000 0000 0000 0000 0000 0000 1101
    -18
    1000 0000 0000 0000 0000 0000 0000 0001 0010
    18
    0000 0000 0000 0000 0000 0000 0000 0001 0010
    step1:
    13=0*2^30 + 0*2^29 +...+ 1*2^3 + 1*2^2 + 0*2^1 + 1*2^0
    step2:
    0000 0000 0000 0000 0000 0000 0000 0001 0010
    +
    0000 0000 0000 0000 0000 0000 0000 0100 1000
    +
    0000 0000 0000 0000 0000 0000 0000 1001 0000
    =
    234
    0000 0000 0000 0000 0000 0000 0000 1110 1010
    对符号位进行异或
    234
    0000 0000 0000 0000 0000 0000 0000 1110 1010
    
    3)结果溢出
    计算:(2^31-1)*2=2^32-2
    2^31
    0111 1111 1111 1111 1111 1111 1111 1111 1111
    2
    0000 0000 0000 0000 0000 0000 0000 0000 0010
    step1:
    2^31=1*2^30 + 1*2^29 +...+ 1*2^3 + 1*2^2 + 1*2^1 + 1*2^0
    step2:
    0000 0000 0000 0000 0000 0000 0000 0000 0010
    +
    .
    .
    .
    +
    0100 0000 0000 0000 0000 0000 0000 0000 0000
    +
    1000 0000 0000 0000 0000 0000 0000 0000 0000
    =
    1111 1111 1111 1111 1111 1111 1111 1111 1110
    

    四、除法

    1)被除数 > 除数
    计算:18/13 = 1...5
    18
    0000 0000 0000 0000 0000 0000 0000 0001 0010
    13
    0000 0000 0000 0000 0000 0000 0000 0000 1101
    从左向右依次取出一位被除数与除数比较,直到被除数到达最后一位,忽略前边0
    1 < 0000 0000 0000 0000 0000 0000 0000 0000 1101
    结果0 余数 1
    10 < 0000 0000 0000 0000 0000 0000 0000 0000 1101
    结果0 余数 10
    100 0< 0000 0000 0000 0000 0000 0000 0000 0000 1101
    结果0 余数 100
    1001 < 0000 0000 0000 0000 0000 0000 0000 0000 1101
    结果0 余数 1001
    10010 > 0000 0000 0000 0000 0000 0000 0000 0000 1101
    结果1 余数 10010-1101 = 0 0101
    结果 0 0001 = 1
    余数 0 0101 = 5
    
    2)被除数 < 除数
    计算:13/18 = 0...13
    13
    0000 0000 0000 0000 0000 0000 0000 0000 1101
    18
    0000 0000 0000 0000 0000 0000 0000 0001 0010
    从左向右依次取出一位被除数与除数比较,直到被除数到达最后一位,忽略前边0
    1 < 0000 0000 0000 0000 0000 0000 0000 0001 0010
    结果0 余数 1
    11 < 0000 0000 0000 0000 0000 0000 0000 0001 0010
    结果0 余数 11
    110 0< 0000 0000 0000 0000 0000 0000 0000 0001 0010
    结果0 余数 110
    1101 < 0000 0000 0000 0000 0000 0000 0000 0001 0010
    结果0 余数 1101
    结果 0
    余数 1101 = 13
    
  • 相关阅读:
    【mongoDB运维篇④】Shard 分片集群
    【Linux高频命令专题(11)】cp
    【Linux高频命令专题(10)】mv
    Nginx + Lua + 共享内存
    ngx_lua模块学习示例之waf
    在 Golang 中使用 Protobuf
    openresty package.path require 报错
    ngx_lua 模块
    Lua中的常用语句结构以及函数
    lua日期与时间操作
  • 原文地址:https://www.cnblogs.com/mlr-wjy/p/12729020.html
Copyright © 2011-2022 走看看