计算机中的负数:二进制补码

目录

二进制运算

补码的概念

证明负数可以用补码表示

二进制运算

计算机中,数值的运算都是用二进制表示的。

一个二进制数中,最高位是符号位,0 为正数,1 为负数。

6 的二进制:0000 0110

8 的二进制:0000 1000

-8 的二进制:1000 1000

如计算: 6 + 8

 00000110

+00001000

---------

 00001110

得到结果是 0000 1110,也就是十进制的 14。

但是如果计算: 6 + (-8) 

 00000110

+10001000

---------

 10001110

得到的结果是 1000 1110,也就是十进制的 -14, 显然该结果是错误的。

从上面例子看出,如果使用正常的加法规则来运算,正数和正数相加的结果是正确的,而正数和负数相加的结果是错误的。

在计算机中,为了解决正数和负数相加的问题,采用补码来表示负数。

补码的概念

在介绍补码的概念之前,先介绍一下“模”的概念。

假设当前时针指向 8 点,而准确时间是 6 点,调整时间有以下两种拨法:

一种是倒拨 2 小时,8 – 2 = 6 点;

另一种是顺拨 10 小时,8 + 10 = 12 + 6 = (12 + 6 ) % 12 = 6 点;

即 8 – 2 = 8 + 10 = 6 点 。

时钟的“模”是 12,减 2 和 加 10 的效果是一样的,也就是 2 和 10 互为补数。

如果两个数互为补数,那么它们的和正好等于“模”。所以,减法也就可以转成加法运算:

X – Y = X + ( Y 的补数 ) = X + (“模”- Y)

对于计算机,其概念和方法完全一样。n 位计算机,设 n = 8,所能表示的最大数是 1111 1111,若再加 1 成 1 0000 0000 (9位),但因只有 8 位,最高位 1 自然丢失,又回到了 00000000,所以 8 位二进制系统的“模”为 2 的 8 次方。在这样的系统中减法问题也可以化成加法问题,只需把减数用相应的补数表示就可以了。把补数用到计算机对数的处理上,就是补码。

求给定数值的补码分以下两种情况:

  • 正数的补码,与原码相同。

  • 负数的补码,将其原码除符号位外的所有位取反(0 变 1,1 变 0,符号位为 1 不变)后加 1。

8 位计算器的负数的补码计算公式:

1111 1111 – 负数的原码 + 1 = 1 0000 0000 – 负数的原码 = “模”- 负数的原码

如上例子,要计算 6 + (-8),要先得到 -8 的补码,然后 6 加上补码:

-8 的补码:1111 0111 + 1 = 1111 1000

6 加上补码:0000 0110 + 1111 1000 = 1111 1110

结果中第一位是 1,表示这个结果是负数的补码,该补码对应的负数为(先减 1,再取反):

先减 1:1111 1110 – 1 = 1111 1101

再取反:1000 0010(也就是十进制的 -2)

在计算机系统中,数值一律用补码来表示和存储。原因在于,使用补码,可以将符号位和数值域统一处理。同时,加法和减法也可以统一处理,也就是只使用一种加法电路就能完成加法和减法的运算。

证明负数可以用补码表示

证明:X – Y = X + (-Y) 的补码

-Y 的补码:(1111 1111 – Y) + 1

X – Y = X + (-Y)的补码

        = X + (111 11111 – Y) + 1

        = X – Y + 1 0000 0000

        = X – Y + 0000 0000

        = X – Y

在 8 位计算机中,1 0000 0000(9位)的最高位 1 需要舍弃,也就是 0000 0000。

 

    原文作者:Leon.ENV
    原文地址: https://blog.csdn.net/hlzgood/article/details/112056812
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞