计算机实现32位整数加减乘除的方法
Posted mlr-wjy
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了计算机实现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
以上是关于计算机实现32位整数加减乘除的方法的主要内容,如果未能解决你的问题,请参考以下文章
"Coding Interview Guide" -- 只用位运算不用算术运算实现整数的加减乘除运算
java中 在控制台录入两个整数,实现加减乘除操作。 要求:计算方法作为
用c语言实现大整形运算,64位长整型的加减法,输入限制为64位长度整数
2021-09-11:给你一个32位的有符号整数x,返回将x中的数字部分反转后的结果。反转后整数超过 32 位的有符号整数的范围就返回0,假设环境不允许存储 64 位整数(有符号或无符号)。(代码片段