原码,反码,补码,到底是个啥? -?,你来这看看吧。

写在前面:这里是小王成长日志,一名普通在校大学生,想成学习之余将自己的学习笔记分享出来,记录自己的成长轨迹,帮助可能需要的人,平时博客内容主要是一些系统的学习笔记,项目实战笔记,一些技术的探究和自己的一些思考。欢迎大家关注,你们的每一个评论点赞关注我都会仔仔细细去看的。有任何问题欢迎交流,我会尽我所能帮助大家的,共创CSDN美好环境。

这篇博客主要讲解计算机的原码,反码和补码,以他们之间的关系,算是另外一篇博客-《别看了!C语言里的unsigned int/char 看我就够了》的补充,两篇放在一起看的话效果可能更好,需要的同学直接点传送门过去就好了。


1.概述

原码:

  • 原码是一个数在计算机中最简单的表达形式,由符号位(0正1负)和数值位(绝对值)组成
  • 但是会有两个0: +0(0000 0000) 和 -0(1000 0000)

反码:

  • 原码除符号位外按位取反(1与0的互换),只对负数有意义,正数反码还是自己

  • 例如:

原码 反码
0000 1111 0000 1111
1000 1010 1111 0101

补码:

  • 反码加1,还是只对负数有意义,正数补码还是自己.在计算机中负数以其补码形式表达
    例如(以-5为例):
原码(符号位+数值位) 反码(除符号位外按位取反) 补码(反码+1)
10000000 00000000 00000000 00000101 11111111 11111111 11111111 11111010 11111111 11111111 11111111 11111011

小总结

其实看到这里我们可以发现,正数的原码,反码,补码三者是一致的,我们在关注反码和补码的时候主要是针对负数,那为什么计算机里负数的表示要这么与众不同,花里胡哨呢,我们一起向下看:

2.为什么要有原码,反码,补码

我们好好回头想想原码,反码和补码,是不是一个比一个复杂,一个比一个难懂,如果我们自己要计算的话,最好希望全是原码甚至全是原原本本的十进制值多好,反正我们一眼就可以看出其正负!问题就出在这个一眼就看出其正负上,首先我们先谈一下模的概念:

模的概念

以下是百度百科原文,我查到的时候感觉蛮好的,做了排版就直接放上来了:

在介绍补码概念之前,先介绍一下“模”的概念:“模”是指一个计量系统的计数范围,如过去计量粮食用的斗、时钟等。计算机也可以看成一个计量机器,因为计算机的字长是定长的,即存储和处理的位数是有限的,因此它也有一个计量范围,即都存在一个“模”。如:时钟的计量范围是0~11,模=12。“模”实质上是计量器产生“溢出”的量,它的值在计量器上表示不出来,计量器上只能表示出模的余数。任何有模的计量器,均可化减法为加法运算

假设当前时针指向8点,而准确时间是6点,调整时间可有以下两种拨法:一种是倒拨2小时,即8-2=6;另一种是顺拨10小时,8+10=12+6=6,即8-2=8+10=8+(12-2)(mod 12).在12为模的系统里,加10和减2效果是一样的,因此凡是减2运算,都可以用加10来代替。若用一般公式可表示为:a-b=a-b+mod=a+(mod-b)。对“模”而言,2和10互为补数。实际上,以12为模的系统中,11和1,8和4,9和3,7和5,6和6都有这个特性,共同的特点是两者相加等于模。

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

有没有点关于补码的头绪了

  • 首先想想我们构造补码的第一步:除符号位外按位取反得到一个新的数。如果我们将反码和原码除符号位外按位相加呢,其结果就是一个全为1的数。

  • 然后再想想我们构造补码第二步,反码+1。同理,把他加到我们刚刚得到的结果之上(其实总的就是补码加原码),结果就是一个模!!

接下来我们还是以负数-5为例一起看看这个过程

0 1
原码 10000000 00000000 00000000 00000101
反码 11111111 11111111 11111111 11111010
补码 11111111 11111111 11111111 11111011
原码+反码 11111111 11111111 11111111 11111111
(原码+反码)+1 // 补码+原码 (1) 00000000 00000000 00000000 00000000

再看模

现在有没有懂原码补码和模之间的关系了,模的概念中有一句话:

在这样的系统中减法问题也可以化成加法问题,只需把减数用相应的补数表示就可以了。

所以计算机中在进行减法的时候,就是采用的模的概念,加上一个负数(减去一个数)就等于加上他的补码。

那到底为什么要舍近求远呢

首先明白一点:加上一个负数等于减去一个正数,反之亦然,我们继续往下看。

我们之前提到,如果我们自己来算,肯定全部原码最好,因为我们一眼就能判别正负,但对于计算机而言并不是这样,如果我们又要设计一套系统来事的计算机判别“符号位”显然会使得我们的计算机设计更加臃肿,这对于本来就只能使用电路开闭来表示10的计算机系统可能又是一项重负,因此我们让计算机在保存以及运算负数的时候,使用其补码而非其原码,即加上一个负数(减去一个数)的时候计算机就转换为加上他的补码,把减法也化成了了加法。

其次,如果我们让一正一负两个数相加,那么其符号位怎么判断呢?直接相加 ,(1+0) 那么值永远为负,难道我们又要判断一次是谁的绝对值最大吗?还是补码,补码运算的时候符号位也参与运算, 就再也不用判断。

3.参考:

  • 详见原文超链接

4.以往文章推荐


都看到这里了,各位哥哥姐姐叔叔阿姨给小王点个赞 关个注 留个言吧,和小王一起成长吧,你们的关注是对我最大的支持。


如果以上内容有任何不准确或遗漏之处,或者你有更好的意见,就在下面留个言让我知道吧-我会尽我所能来回答。

发布了20 篇原创文章 · 获赞 120 · 访问量 7358

猜你喜欢

转载自blog.csdn.net/weixin_45761327/article/details/105338164