By Mejias Tse
Module
-4
=256 - 4
=1 0000 0000 - 0000 0010
=(1 + 1111 1111) -0000 0010
= 1 + (1111 1111 - 0000 0010)
-x
=256 - x /* x的补码,module - x
=(1 + 1111 1111) -x
=1 + (1111 1111 -x)
= 1 + x按位取反
由以上可知,x的补码为1 +( x的按位取反)
正数(含0)+正数(含0)
情况一:不存在进位,和为正数(含0)
已知一个正数为x,另一个正数y的取值范围为(0 0000) <= y <= (max 0 1111 -x)
(0 <= x <= max 0 1111) + (0 <= y <=(max 0 1111- x) )
0 <= (x + y) <= max 0 1111
情况二:进位,溢出
已知一个正数为x,另一个正数y的取值范围为( 0 1111 -x) <= y <= 0 1111
(0 <= x <= max 0 1111) + ( (0 1111- x) < y <= 0 1111)
(0 1111- x + x) < ( x + y) <= ( 0 1111 + 0 1111 )
0 1111 < (x + y) <= 1 1110
由以上可知,已知正数x
另一个正数y的取值范围为 <=0 1111 - x时,不存在进位,和为正数
另一个正数y的取值范围为 >0 1111 - x时,存在进位,溢出
负数 + 负数
情况一:进位舍弃仍为负数
已知一个负数为x,另一个负数y的取值范围为(min 11 0000 - x) <= y <= 1 1111
(min1 0000 <= x <= max 1 1111) + (min11 0000 - x) <= y <=max 1 1111)
(Min 11 0000 - x + x) <= (x + y) <= (1 1111 + 1 1111)
11 0000 <= (x + y ) <= 11 1110
/*到这一步证明存在进位
(11 0000 -module 10 0000 ) <= (x + y) <= (11 1110 - module10 0000)
/*进位后的数值大于module时,可减去module或module的倍数
1 0000 <= (x + y) <= 1 1110
/*到这一步证明不溢出
情况二:进位溢出
已知一个负数为x,另一个负数y的取值范围为(1 0000 <= y < 11 0000 - x)
X + < (11 0000 -x)
(min1 0000 <= x <= max 1 1111) + (min1 0000 <= y < 11 0000 - x)
(Min1 0000 + min 1 0000) <= (x + y) < (1 1111 + 11 0000 - x)
10 0000 <=(x + y) <= (110 1111 - X)
/*到这一步证明存在进位
(10 0000 -module 10 0000) <=(x +y ) <(110 1111 -x -module 10 0000* 10)
/*进位的数值大于module时,可减去module或module的倍数
0 <= (x+y) < (10 1111 - x)
0 <= (x + y) < (10 1111 - 1 1111)
0 <= ( x + y) < 1 0000
/*到这一步证明溢出
由以上可知,已知负数X
另一个负数的取值范围为>=11 0000 - x时,进位舍弃为负数,不溢出
另一个负数的取值范围为 <11 0000 - x时,进位舍弃,溢出
一正一负
(0 <= x < =max 0 1111) +( 1 0000 <= y <= max 1 1111)
1 0000 <= (x + y) < = (10 1110 - module 10 0000)
1 0000 <= (x+y) <= 0 1110
由以上可知,一正一负最终结果为负数或正数,且不可能溢出
综合上述的描述:
已知正数补码为x,另一个加数为正数时,其补码合理取值范围是<=0 1111 - x
另一个加数为负数时,其补码为默认负数补码的取值范围
已知负数补码为x,另一个加数为正数时,其补码为默认正数补码的取值范围
另一个加数为负数时,其补码合理取值范围为>=11 0000 - x