在计算机中,为啥负数要用补码的形式表示呢?(图文并茂版)

Posted 温柔且上进c

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在计算机中,为啥负数要用补码的形式表示呢?(图文并茂版)相关的知识,希望对你有一定的参考价值。

原码、反码、补码形式的介绍

符号位

       •在标准计算机中规定,把内存最高位作为符号位,且最高位为0表示正数,为1表示负数

原码

       •原码:一种计算机对数字的二进制表示方法,并带有符号位(最高位为0表示正数,为1表示负数)

00000000 00000000 00000000 000001117 的原码
如 10000000 00000000 00000000 00000111-7 的原码

注意:

       •0的原码有两种表示方法,+0,-0都为0的原码

00000000 00000000 00000000 000000000 的原码
如 10000000 00000000 00000000 000000000 的原码

反码

       •正数的原码、补码、反码是相同的!!!

00000000 00000000 00000000 000001117 的原码
如 00000000 00000000 00000000 000001117 的反码
如 00000000 00000000 00000000 000001117 的补码

       •将二进制数按位取反即可得到负数的反码

10000000 00000000 00000000 00000111-7 的原码
如 11111111 11111111 11111111 11111000-7 的反码

       •只有负数的反码为按位取反,正数的反码与原码相同!!!

补码

       •负数的补码为:将负数的二进制按位取反后得到反码,再反码+1,即可得到负数的补码
       •正数的补码与原码相同!!!

10000000 00000000 00000000 00000111-7 的原码

如 11111111 11111111 11111111 11111000-7 的反码

如 11111111 11111111 11111111 11111001-7 的补码

       •通过上述对原码、反码、补码的了解,接下来我们将解释为啥在计算机中,负数要以补码的形式表示,首先我们需要了解算数中的概念

什么是模数

In mathematics, modular arithmetic is a system of arithmetic for integers, where numbers “wrap around” upon reaching a certain value—the modulus (plural moduli).

模数的理解

       •模数是指一个计量系统的计数范围,例如时钟,水表盘等等,计算机本质上就是一个大型计算器,它也有一个计量的范围,即为计算机也存在模数
       •如:时钟的计量范围是0~11,即模数为12
       •如:64位的计算机的计量的范围是2^64
,即模数为2^64
       •模数是计算器产生‘溢出’的量,它的值在计算器上表示不出来,计算器上只能表示出模的余数,例如:10的余数有0、1、2、3、4、5、6、7、8、9

补数

       •假设当前时针指向十点,而当前准确时间是八点,将时间调整正确的方法有以下两种:
              •一:逆时针拨动两个小时,即:10-2=8
              •二:顺时针拨动十个小时,即:10+10=12+8=8
       •在以模为12的系统中,减2和加10的效果是一样的,因此,凡是减2的运算都可以用加9来代替,对模数12来说,10与2互为补数(二者相加等于模)
       •有上述可得出结论,即在一个有模的计量系统中,减一个数,等于加上它的补数,从而达到将减法运算转换成加法运算的目的!!!

补码原理

       •计算机上的补码就是算数里的补数,将减法化为加法运算
       •设我们计算机是4位的,则其计量范围的模是:2^4 = 16,所以表示的范围为-8~7
       •举例如下:
       •以上计算机为例,请计算5 - 3的值,将题中的减法运算转换成加法运算,因此需将5 -3 转换成加法计算:

 # 上述理论可得,减一个数等于加上它的补数,所以
 5 - 3
 # 等价于 
 5 + (16 - 3)   // 算术运算单元将减法转化为加法
 # 用二进制表示上述式子则为:
 0101 + (10000 - 0011)
 # 等价于
 0101 + ((1 + 1111) - 0011)   # 10000=1111+1
 # 等价于
 0101 + (1 + (1111 - 0011))   # 结合律,将后两个数结合
 # 等价于
 0101 + (1 + 1100)   # 1111-0011 运算可得 1100
 # 等价于
 0101 + 1101
 # 所以从上述可得:
 -3 = 1101
 # 即 `-3` 在计算机中的二进制表示为 `1101`
 # 最后一步 0101 + 1101 等于
 10010

       •从上述题目可得,我们的计算机是 4 位的,计算结果为5位,第一位“溢出”了,所以我们只保存了 4 位,即 0010,而当计算机去读取这个值时,这正是我们所期望的 2
       •上述就是计算机中减法的基本运算方法,将减法转换成加法,进行运算操作!!!!

以上是关于在计算机中,为啥负数要用补码的形式表示呢?(图文并茂版)的主要内容,如果未能解决你的问题,请参考以下文章

补码原理——负数为什么要用补码表示

原码,补码,反码

负数二进制在32位int表示

单精度浮点数中的阶码的表示范围为啥不是0~255?

在C语言中为啥int型的取值范围是-32768~32767

c语言中10010100为啥是-20