疫情期间手机直线:18622734798
当前位置:首页网站设计:基础篇 → 全部信息
负的二进制数浅谈
更新时间:2012/8/21 点击:1681次

二进制算术需要理解的另一个方面是负数。前面一直假定所有的数字都是正的。从乐观的角度来看是这样,所以我们目前已对二进制数有了一半的认识。但在实际中还会遇到负数,从悲观的角度来看,我们对二进制数的认识仅仅是一半。在计算机中,是如何表示负数的?我们只能按照自己的意愿来处理二进制数字,所以解决方案必须是使用其中的一个二进制数字。

对于允许是负数的数值(称为带符号的数值),必须先确定一个固定的长度(换言之,就是二进制数字的位数),再把最左边的二进制数字设置为符号位。必须固定位数,这样才能避免符号位与其他位的混淆。

因为计算机的内存由8位字节组成,所以二进制数字要存储在多个8位中(通常是2的幕),即有些数字是8位,有些数字是16位等。只要知道每个数值的位数,就可以找到符号位,它应是最左边的那一位。如果符号位是0,该数值就是正的,如果它是1,该数值就是负的。

似乎这就解决了问题,但实际上并非如此。当两个整数相加时,计算机不应不检查两个数字是否为负。我们希望使用常规的“加”来生成相应的结果。如果把–8加到+12上,答案就应是+4。

如果用简化的解决方案来执行这一操作,也就是把正数的符号位设置为1,使它变成负数,再执行算术运算,并进行常规的进位,答案就是错误的:

12转换为二进制: 0000 1100

–8转换为二进制: 1000 1000

如果把它们加起来,结果是 1001 0100。

答案是-20,这可不是我们希望的结果+4,它的二进制应是0000 0100。此时读者会认为,“没有把符号作为另一个位”。但是,在用计算机进行计算时,这是必须要考虑的。因为计算机是哑巴,它们处理这种情况会出问题。我们需要用另一种方式来表示负数。

下面看看计算机如何表示–8,即从+4中减去+12,得到正确的结果:

+4转换为二进制: 0000 0100

+12转换为二进制: 0000 1100

从前者中减去后者,结果是 1111 1000。

对于右边的4位数字,必须借1,才能进行减法,这正是我们在执行十进制算术时所进行的操作。结果就是–8,即使它看起来不是–8,但其值的确是–8。再用二进制把该值与+12或+15相加,就会得到正确的结果。

在从4中减去12时,究竟进行了什么操作?实际上是对负二进制数值采用了2的补码形式。这里需要做一个约定,以避免解释它为什么有效。下面看看如何从正数中构建负数的2的补码形式,读者也可以自己证明这是有效的。现在回到前面的例子,给-8构建2的补码形式。首先把+8转换为二进制:

0000 1000

现在反转每个二进制数字,即把0变成1,把1变成0:

1111 0111

这称为1的补码形式,如果给这个数加上1,就得到了2的补码形式:

1111 1000

这就是从+4中减去+12,得到的–8的二进制表示。为了确保正确,下面对–8和+12进行正常的相加操作:

+12转换为二进制 0000 1100

–8转换为二进制 1111 1000

把这两个数加在一起,得到: 0000 0100

答案就是4。这是正确的。左边所有的1都向前进位,这样该位的数字就是0。最左边的数字应进位到第9位,即第9位应是1,但这里不必担心这个第9位,因为在前面计算-8时从前面借了一位,在此正好抵消。实际上,这里做了一个假定,符号位1或0永远放在最左边。读者可以自己试验几个例子,就会发现这种方法总是有效的。最妙的是,这使计算机上的算术计算非常简单快速。

  • 疫情期间手机直线:18622734798    服务邮箱:service@nfree.cn     QQ:1448132697
  • 地址:天津市河西区围堤道146号华盛广场B座22楼    

    津公网安备 12010302001042号

  • CopyRight 2006~2024 All Rights Reserved 天津市华易动力信息科技有限公司