二进制加减法归纳
首先,加减法的基础:
计算机以补码作为计算基础:
不论正负数,最高位永远代表符号位,正数的符号位为0,负数为1。
正数的补码就是其本身,即01011为01011.
负数的补码略微复杂,我自己比较喜欢的计算方式为:
首先最高位是符号位1,以4bit为例,那么1000就代表着 -1*2^3=-8。
其余位按正常处理,如1011就是 -8+2+1=-5。
如果计算机有很多富裕的位,那么正数需要将富裕的最高位全部补0,负数全部补1。正数很好理解,负数全部补1可以理解为:
如1011,如果增加一位最高位补1,那么新的最高位(2^4)就是之前最高位(2^3)的两倍,由于2^3不再是最高位,所以其符号变为正号,新最高两位的数字和仍然是-2^3,并不会发生变化,如果再增加最高位,同理,新最高位是旧最高位的两倍,即2^5=2*2^4=2*2*2^3,而其后两位2^4+2^3=3*2^3,和最高位的计算和仍然是-8。也就是说,不论如何增高位的1,在补码的计算规则下,高位1的计算和永远是不变的。
本质上,这是由于:比如11111=-1,当每一位都是1的时候,值为-1,其余负值都是在此基础上去减去对应位的数值。所有不论前面有多少位是1,并不影响后续位需要扣除的值。
所以,001011=01011,
11011=1011=-16+8+2+1=-5。
溢出:
当符号位不同的数字相加肯定不会溢出,因为最终数一定会比原来某一个数小。
当符号位相同的数字相减肯定不会溢出,因为减法的本质是加上一个负数,即两个符号位不同的数字相加。
只有两个数字都很大的时候,相加或相减有可能发生溢出,具体的归纳可以查询书籍。
Comments
Post a Comment