大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。
Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺
二进制的减法分为两种:
1.使用硬件减法器运算;
2.将减法转换成加法运算。
本文讲述第二种方法。
大家都知道计算机有两种数值类型:
1.有符号类型;
2.无符号类型。
有符号类型是利用其二进制的最高位来存储正负标志的,所以有符号类型的最大值的绝对值要小于无符号类型,就是因为有符号类型比无符号类型少了一位数据位,大小当然就少一半了,但是两种类型所表示的数值的个数是一样多的,因为从二进制角度来看,两种类型没有任何的区别。
在这里我们主要使用的就是有符号类型,而无符号类型实际上是可以通过扩展一位符号位来转为有符号类型的。
我们知道数学里的减法等价于加上一个相反数,计算机也是利用了这一特性来进行减法运算的。
这里要提到两个概念:原码、反码。
原码即数值的原始二进制编码。
反码即除标志位外的所有位进行按位取反运算所得到的二进制编码,如原码为10001000的数的反码为11110111。
注:反码和补码只针对于负数,正数的反码和补码等于原码,即正数的原码、反码和补码一样。
下面我们来看看计算机是怎样进行减法运算的:
00000001(1)- 00000001(1)= 00000001 + 10000001
取所有数值的反码:
00000001(正数的反码不变)+ 11111110(负数的反码)
进行二进制的加法运算:
= 11111111 (结果也为反码)
由于结果也为反码,而且为负数,所以要取得真正的结果还要进行反向运算,反码的反向运算和正向运算算法一样:
10000000 = -0
现在问题出现了,怎么会是-0呢,所以,又提出了补码的概念。
补码即反码+1,是为了解决标志位问题而提出的,它使标志位也参加到了运算中去。
下面我们再用补码重新做一遍:
00000001(正数的补码不变)+ 11111111(负数的补码) = 00000000(最高位进位超出范围,被丢弃)= 0
注:正数结果的补码等于原码,所以不需要反向运算了。
结果正确了,下面我们做几个练习吧:
11 – 4 = 7
00001011 – 00000100 = 00001011 + 10000100 = 00001011 + 11111100 = 00000111 = 7
正确。
4 – 11 = -7
00000100 – 00001011 = 00000100 + 10001011 = 00000100 + 11110101 = 11111001 = 10000111 = -7
正确。
好,二进制的减法就讲到这里了。
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/193740.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...