在计算机中,数字用二进制补码来表示和存储。原码和补码这两种表示方法均有符号位和数据位。符号位的含义相同,1表示+,0表示-。而数值位的表示方法并不相同。
对于整数,原码和补码相同。
对于负数,得到他的补码需要两步:
- 将其原码除符号位外的所有位取反。也就是说0变1,1变0,符号位1不变。
- 将1#得到的值+1。
例如:在8位二进制中,-7的原码为1000 0111
- 将其原码除符号位外的所有位取反:
1111 1000
- 将1#得到的值+1:
1111 1001
数字用二进制补码来表示和存储优点:
1. 补码的补码是原码。也就是说补码和原码相互转换,其运算过程是相同的。
- 对于正数,无论取补多少次,原码和补码都一样。
- 对于复数,
-7的原码为
1000 0111
补码为
1111 1001
对其求补:
将其原码除符号位外的所有位取反:
1000 0110
将i#得到的值+1:
1000 0111
2. 加法和减法可以统一处理。
为了理解这一特性,引入“模”的概念。模是指一个计量系统的计数范围,如时钟。时钟的计量范围是0~11,模=12。同理,如果将n位计算机也看成是一个计量系统,则其计量范围为0~2^n -1,模=2^n。
“模”实际上是计量器产生“溢出”的量,其值在计量器上表示不出来,计量器上只能表示出模的余数。任何有模的计量器,都可以化减法为加法运算。
例如:假设当前时钟指向10点,如果想要将其调到6点,有两种方法:
倒拨4小时,
10-4 = 6
顺拨8小时,
10+8 = 18,18%12 = 6。
也就是说,在以12为模的系统中,加8和减4的效果是一样的,因此凡是减4的运算,都可以用加8来代替。对“模”= 12而言,8和4互为补数。
将模的概念和方法扩展至n位计算机,模=2n , 相加和为 2n的两个数互为补数,减法问题可以化为加法问题。把补数应用到计算机对数的处理上,就是补码。
3. 可以将符号位和数值位统一处理。
例如,需要求 2+ (-1),假设数字用8位二进制表示,那么2的补码是
0000 0010
-1的补码是
1111 1111
则有
0000 0010 + 1111 1111 = 1
这里进位的时候,完全不用考虑符号位和数值位的区别,很大程度的精简了计算步骤。
4. 0只有一种表示方法。
取补的具体方法,主要有两种,one’s complement和two’s complement。
- one’s complement:
N = (2^n^ - 1) – N
这种表示方法存在着一个问题,即有两个0。
正0:
0000 0000
负0:
1111 1111
对于正0,很好理解,对于负0,可以考虑1+(-1),
1的补码
0000 0001
-1的补码
1111 1110
0000 0001 + 1111 1110 = 1111 1111
造成了数字表示和存储的冗余甚至混乱。
- two’s complement:
N’ = 2^n^ – N
在one’s complement的基础上改进,取反之后对得到的值+1,消除了负0。
网友评论