读书人

相干补码、有符号数的理解

发布时间: 2012-07-27 11:03:01 作者: rapoo

有关补码、有符号数的理解
1.对计算机中负数的理解
(1)不要相信世界上本来就存在负数,负数的本质就是减法,任何一个负数的本质是表示0减去一个正数这一过程,负数不是一个结果, 而是一个过程
(2)课本上一直讲,负数在计算机中是以补码的形式存储的,错误!严重误导,所存储的不是个结果、实物,而是一个过程、动作.是表示一个减法式
具体讲:现在有个数-1,要理解成"0-1"这一表达式,这样,是你的话你会怎么将0-1表达式的含义存储到4位存储单元中呢?
(联想一下钟表可以推得)==>0-1=0+1[补]=0+(模-1)=1111
没错,就像钟表一样,假如现在是晚上0点,提前一小时(晚上11点)和晚11个小时(早上11点)指针指的是同一个位置,
这时可以说晚上11点和早上11点是相同的,因为时针永远在12个点间轮回,而现在两个状态指的是同一位置,当然是相等的.
但必须要承认,晚上11点和早上11点表达的意义是不同的.本质在于,转动的方向.
把4位存储单元想像成一个老_虎机,想像其可以正转也可以反转,好了,正转就是正数,注意反转不是负数,而要理解成"0-转动量",
先想象闹钟,正转11点和反转1点这两种情况指在了相同的位置上,因其构造是圆的,很容易理解,
但四位存储单元不能像这样容易理解成正转1111和反转1这两种情况转到同一状态位置上,尤其是0000反转1怎么会是1111呢?
那么反过来想,1111正转1==>模10000==>溢出==>0000.ok!0000反转1就是1111了.
问题出来了,反转1和正转1111这两种情况的表象一致.那么当我看四位存储单元存储了1111时,我怎么知道是正转了1111还是反转了1得到的这个结果呢?
其实就是方向的问题,(以上讨论假设还未出现最高位代表符号位的设计)结果是伟大的科学家们牺牲了最高位来表示方向-0代表正转,1代表反转
(3)(以下讨论以4位存储单元为例)现在可以容易理解,有符号数的存储特性了.
先说一下无符号数的特性,很容易理解,因为无符号数的存储,即不考虑转动方向,或者说只能正转,很明显,最小值是0,最大值是1111
有符号数的情况麻烦一点,牺牲最高位,正数其实就是从0000开始正转得到的,最多允许你转到0111这个状态,再转就溢出了,因为最高位是状态位,不许变;
负数就是从0000开始反转得到的,[反转1<=>0-1<=>-1<=>1111][反转2<=>0-2<=>-2<=>1110][反转3<=>0-3<=>-3<=>1101]....(计算规律是:把0000当作模10000,认为他们是同等的,那么反转3下,就是用模10000-0011,即得1101)
[反转7<=>0-7<=>-7<=>1001][反转8<=>0-8<=>-8<=>1000],不能转了,再转就要破坏符号位了..
结果是有了课本中所述理论,有符号数(4位)最大是7(0111),最小是-8(1000)
(4)从表相看来
正转:(正数)数值变大(0->7),存储单元表相数值变大(0000->0111)
反转:(负数)数值变小(-1->-8),存储单元表相数值变小(1111->1000)

可以仿照整数数轴以正转和反转为正负轴画出有符号位的二进制数的变化趋势,暂略
2.[算补数时的取反加1法]的理解
(1)(不考虑符号位的情况)一个数X与其反数X[反]相加必然得"最大数"(模-1的数),再加1--->即得模
比如:10101010[X]
+ 01010101[X[反]]
--------
11111111
+ 00000001
--------
100000000(即模-容量)
(2)2进制环境下的计算,取反加1法才适用,因为在这种情况下存在反数,而一个数与其反数相加就好比两把互补的叉子相互交叉起一样,
整好形成满局(注意是最大数,离模/容量还差1),具体点讲,n位二进制环境下,一数与其反数相加肯定等于11111..{n个1},比模的大小就小1
(3)补数的本质---A+B=模(存储容量),就称A和B互为补数.
具体讲,比如钟表,模是12(一共可表示12个点),而最大值是11,最小值是0===>2点和10点/3点和9点都是互为补数.
不论进制环境(不论几进制的情况)如何,求数A的补数都可以理解为--->模-A = A[补]
比如:-1(1的补数)存储到8位存储单元中时,是100000000(模) - 1 = 11111111(反转1)
3.对最高位作为符号位的理解
那四位存储单元为例,不考虑符号时其存储容量是16,即0~15;考虑符号位时其容量还是16,即-8~7。可以看出牺牲最高位并没有亏损容量,只是范围变了。

读书人网 >其他相关

热点推荐