有符号⼆进制加法溢出判断以及溢出后该如何计算正确答案
我想从五个⽅⾯来说说有符号⼆进制加法溢出以及溢出后该如何计算这些个问题:
1. ·什么是有符号⼆进制数
2. 补码的计算以及还原
3. 有符号数的加法
4. 什么是溢出、什么是⾃然丢弃
5. 溢出后该如何正确计算结果
⼀.什么是有符号⼆进制数
⼆进制数分为有符号和⽆符号两种形式,在未标明的情况下,⼆进制数指的是⽆符号⼆进制数,即没有负数形式。反之,有符号⼆进制数,是指有正负号的⼆进制数。
有符号⼆进制数即在⽆符号⼆进制数的基础上,在最左边添加符号位,‘0’为正,‘1’为负。
举例说明:-2 1(符号位 ‘1’表明是负数)10(2的⼆进制表达) --> 110
+2 --> 010 
⼆.补码的计算以及还原
在计算机的运算中,是以补码的形式进⾏加减法运算的(减法其实就是带负数的加法,2-3 其实就是2+(-3))。那补码是怎么计算的呢?
分为两种情况:
1.正数补码。 记住正数的补码就是其本⾝。如:+2 -->010 补码–> 010
2.负数补码。 符号位不变,将符号位后⾯的所有数取反,之后进⾏加⼀操作。如:-2 --> 110 补码 --> 101 + 1 -->110. 可以发现它的补码和原码相同,这⾥⼤家留个⼼眼,为后⾯的溢出埋下伏笔。
学会了原码转补码,怎么能不会补码转原码呢。
补码转原码其实就是再将补码进⾏⼀次求补码的操作,即补码的补码是原码。
负75的补码怎么求
三.有符号数的加法
接下来就是开始进⾏加法操作了。在补码的加法运算中,符号位就当成是整个⼆进制数的⼀部分,进⾏
加法运算。
如:+3 + 4
3 --> 0011
4 --> 0100
相加 --------
结果 0111
然后对所得结果求补码(这点很重要,前⾯例⼦发现有些负数的补码就是其本⾝,为了后⾯不弄混淆,建议对所得结果求补码)。此处,正数的补码是其本⾝。计算结果就是0111。
0 表⽰正数 111的⼗进制是7,解为+7。完全正确。
提⼀点如果两个相加数的位宽不同,将⼩的位宽的数左起填充0,然后再进⾏补码操作。
如-2+8 110 + 01000 此处将-2做如下处理。10010(五位保持和+8⼀样位宽) 再将10010做补码处理,–>11101+1–>11110。补码形式加法为:11110+01000
接下来请看什么是溢出,以及溢出的危害是什么。
四.什么是溢出、什么是⾃然丢弃
对于溢出的理解,稍微解释的不详细很可能会把初学者带⼊沟⾥,今天我就被带进沟⾥了。作为⼀个过来⼈我很愿意和⼤家分享,让初次接触的朋友们能很快的理解,避免和我⼀样花⼤量时间从沟⾥爬出来。⾔归正传。
说到溢出,还是要先提⼀下⾃然丢弃。
前⾯的例⼦是很简单的例⼦,请看下⾯这个例⼦:
-2 - 6
-6 --> 1110
-2 --> 1010
相加 --------
结果 11000
结果的位数⽐原先的多出了⼀位,此处最左边的1,是会被⾃然丢弃的(就是不要了)。再看结果,对1000求补码(其实可以看出它就是0)。这和我们想要的-8有天壤之别。为什么会出现这个情况呢?
原因就是这⾥出现了溢出!
⾸先来看溢出的定义:
对⼀个N位⼆进制补码,其可以表达的范围是 - 2^(N-1) 到 2^(N-1) - 1之间。如果超出这个范围就称为溢出了。
拿上⾯的-2-6来说,我们刚刚在计算时,转换为⼆进制补码是4位的。它的取值范围是-8到+7之间。⽽我们想要的结果是-8,⽐范围的最⼩值还要⼩,这个叫做负溢出。同理如果想要的结果⽐最⼤值还要⼤,那么就叫做正溢出,如取值范围是-7~+7之间,想要的结果是+8,那么就是正溢出。
说完了溢出的定义,我们来说说溢出的判定,就是怎么在计算开始时知道⾃⼰算的结果是不是溢出了?
还是拿前⾯-2-6为例,即1110 + 1010,⼤家可以看到我拿两种不同颜⾊标注了它们最开头的两个数,我们把红⾊的(左起第⼀位)符号位进位值和蓝⾊(左起第⼆位)相加的进位值进⾏⽐较。如果两者相同(即00或者11),则不溢出,如果两者不同(即01正溢出,10负溢出),则发⽣溢出,最后的解必定会出错。
拿-2-6为例,它们补码形式为1110+1010,符号位相加发⽣了进位,进位值为1,数字位左起第⼀位相加没有发⽣进位,进位值为0,即10型溢出,为负溢出,就是说所得的值⼩于四位⼆进制补码的取值范围,和我们计算的-8<-7结果相匹配,判断成功。
到这⾥我们已经成功了⼀⼤半,与最终正确解的就值就差⼀步之遥。
五.溢出后该如何正确计算结果
在通过判断之后,我们知道这个结果定是溢出了,该怎么求正确的解呢?
答:将位宽扩⼤⼀位,还是按前⾯的判定⽅法进⾏判定。
举例,-2-6 前⾯说了这是⼀个负溢出,我们在转换为⼆进制时进⾏位宽扩⼤,以提升取值范围。
此处 -2 ⼆进制写成 10010(5位⽐开始多⼀位),-6⼆进制写成10110(5位⽐开始多⼀位)。再进⾏补码运算,10010–> 11101+1–
>11110,10110–>11001+1–>11010.
11110
11010
相加---------
111000 最⾼位超出位宽,⾃然舍弃,剩下的11000求补码,10111+1-->11000 即-8,和我们所求的结果⼀致,bingo答对了。
转载:—————————————————————————————————————————————计算-2 -6 = -8
思路:-2的补码 + -6的补码 = x; 再计算x的补码就是-8
-2——>100010 ——> 111101 + 1 ——>111110 (-2补码)
-6——>100110 ——> 111001 + 1 ——>111010 (-6补码)
-2 + -6 = 111110 +111010 = 1111000 ——> 111000 ——> 100111+ 1 = 101000 = -8

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。