为什么会需要原反补码
加法器计算机里面,只有加法器,没有减法器,所有的减法运算,都必须用加法进行。通过被减数的补码代替被减数,可以把减法转变为加法运算。
对补码的规定
正数的原反补码均不变。
对负数而言,把该数绝对值的补码按位取反,然后对整个数+1,即得该数的补码。
##############
## eg: 正数-正数
##############
x=42
=00101010
y=21
=00010101
x-y
=00101010-00010101
=00101010+(11101010+1)
=00101010+11101011
=00010101
=y
## 笔算:
00101010
- 00010101
—————————————
00010101
##############
## eg2: 正数-负数
##############
x=42
=00101010
y=-21
=11101011
x-y
=00101010-11101011
=00101010+00010101
=00111111
=63
## 笔算:
00101010
- 11101011
—————————————
00111111
什么是模
一个负整数(或原码)与其补数(或补码)相加,和为模。
求负数补码可用另一方法:[x]补 =|x|+模
二进制下,有多少位数参加运算,模就是在 1 的后面加上多少个 0。
例如:8位二进制情况下,其模为 2^8=256=100000000
出现的进位就是模,此时的进位,就应该忽略不计。
补码就是按照这个要求来定义的:正数不变,负数即用模减去绝对值。
补码的方式也避免了0有两种表示方式。
模、补数在日常生活当中,可以看到很多这样的事情:
把某物体左转90度,和右转270度,在不考虑圈数的条件下,最终的效果是相同的;
把分针倒拨20分钟,和正拨40分钟,在不考虑时针的条件下,效果也是相同的;
把数字87,减去25,和加上75,在不考虑百位数的条件下,效果也是相同的;
…。
上述几组数字,有这样的关系:90+270=360、20+40=60、25+75=100式中的360、60和100,就是”模”(也可以理解成”进制”)。式中的90和270、20和40,以及25和75,就是一对对”互补”的数字。知道了”模”,求某个数字的”补数”,就是轻而易举的了:如果模为365,数字120的补数为:365-120=245。
补码的加减法依据
补码的加法运算所依据的基本关系为:
[x]补+ [y]补= [x+y]补
补码减法所依据的基本关系式:
[x-y]补 =[x+(-y)]补= [x]补+ [-y]补
数0的补码表示是唯一的。
[+0]补=[+0]反=[+0]原=00000000
[ -0]补=11111111+1=00000000
x位二进制数可以表示的二进制数范围
x位二进制数:原码是最高位为符号位,其他位表示此数的绝对值的二进制数值,反码是除了符号位的反码表示,补码是反码加1。
假设:
x为8,则原码范围是从01111111~10000000 ,即127~-128反码范围是01111111~100000000 (正数的反码和补码和原码相同),补码范围是01111111~11111111,关键数值点是-1、-127、-128。首先正数不管,因为反码原码补码都相同。看-1:原码10000001,反码11111110,补码是11111111;-127:原码11111111,反码10000000,补码是10000001;-128不能用正常的原码反码表示,但是可以这么想-128=-127-1,所以补码是10000001-1=10000000。所以范围是01111111~10000000,其他位数的表示范围算法也是一样的。