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

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

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


1.概述

原码:

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

反码:

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

  • 例如:学习

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

补码:

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

小总结

其实看到这里咱们能够发现,正数的原码,反码,补码三者是一致的,咱们在关注反码和补码的时候主要是针对负数,那为何计算机里负数的表示要这么不同凡响,花里胡哨呢,咱们一块儿向下看:.net

2.为何要有原码,反码,补码

咱们好好回头想一想原码,反码和补码,是否是一个比一个复杂,一个比一个难懂,若是咱们本身要计算的话,最好但愿全是原码甚至全是原本来本的十进制值多好,反正咱们一眼就能够看出其正负!问题就出在这个一眼就看出其正负上,首先咱们先谈一下模的概念:设计

模的概念

如下是百度百科原文,我查到的时候感受蛮好的,作了排版就直接放上来了:日志

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

假设当前时针指向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都有这个特性,共同的特色是二者相加等于模。htm

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

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

  • 首先想一想咱们构造补码的第一步:除符号位外按位取反获得一个新的数。若是咱们将反码和原码除符号位外按位相加呢,其结果就是一个全为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.以往文章推荐


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


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