原码、反码、补码的理解

原码、反码、补码是什么

在二进制中数字采用原码来表达含义,但存储时确使用的是补码,而负数的补码又是通过反码计算得到的。

原码

在计算机中采用二进制来表示数值,以最高位来表示符号位来表示数值的正负,0001表示十进制的1,1001则表示-1。

反码

正数的反码就是原码

负数的反码是除符号位以外其余位数取反

+1=0001(原码)=0001(反码)
-1=1001(原码)=1110(反码)

补码

正数的补码和反码一样都是原码

负数的补码是反码+1

+1=0001(原码)=0001(反码)=0001(补码)
-1=1001(原码)=1110(反码)=1111(补码)

取模

以一个12小时表示的钟表为例,如果当前时间为4点,想要将钟表的时间调整到2点钟可以有两种方法。

  • 将时钟往前拨动2小时即 4-2=2
  • 将时钟往后拨动10小时即 (4+10) mod 12=2

第二种方法之所以能够使用这是因为钟表最高只能表示到12小时,而超过了这个阈值边会重置,这个12便可以成为模,而(4+10) mod 12=2这个过程就叫做取模

10 mod 12=10
(-2) mod 12=10

10和-2的余相等,可以看出在模为12的情况下-2与10是可以相互代替的。

在计算机中加法的运算远比减法要简单,因此就产生了通过加法来表示减法的方式。即1+(-1)=0这种方式。但是0001+1001=1010=-2而并非0。于是便产生了与调整钟表类似的,通过取模的方法来计算减法(不得不说想出这些方法的真是个人才)。

以4位二进制位例,由于最高位的二进制用来作为符号,实际上表示数的只有三位二进制 因此能表示的最大值是7,即模为7。 那么

(-1) mod 7= 6
从而可以得出
1-1=(1+6) mod 7=0

反码

由于二进制最高位为符号位,所以取模时不能当成数字计算,也就是前面提到的反码

0001(原)+1001(原)=0001(反)+1110(反)=1111(反)=1000(原)
  1(原)+ (-1)(原)=1(反)+-6(反)=-7(反)=(-0)(原)

但在这里我有了疑惑取反后1001实际上变成了-6而不是真正意义上的6。在思考后得出了自己的理解:由于计算机实际上是没有相减的运算存在的,自然也没有符号的概念,所以实际上运算时并没有正负数概念,正负概念是额外给出的定义。因此可以理解为

0-7(0000-0111)为0-7  8-15(1000-1111)为-(0-7)

0001(反)+1110(反)=1111(反)
的过程可以认为是
1[1]+(-6)[14]=(-7)[15]

而反码则可以理解为

由于最高位是符号,不参与取模
1001=1000+(-001 mod 111)=1000+(111-001)
-1=(-0)+((-1)mod 7)=(-0)+(7-1)
而111-001在二进制中又可以直接通过对001取反得到
1000+001(取反)=1000+110=1110
(-0)[8]+6[6]=(-6)[14]

补码

计算机存储使用的是补码,而负数的补码是在反码基础上在+1,有什么作用呢?

由于定义的特殊性所以存在着两个0即0000和1000,分别为+0和-0,那么1+0和1-0会怎么样呢

0001(原)+0000(原)=0001(反)+0000(反)=0000=0001
0001(原)+1000(原)=0001(反)+1111(反)=10000=0000

可以看出虽然+0没有问题但是-0却出现了计算上的错误。

而补码的出现就是用来弥补存在两个0的特殊性问题

0001(原)+1000(原)=0001(反)+1111(反)=0001+10000=10001=0001

在补码的情况下-0的反码转化成了10000而4位二进制最高只能存储4位数值,所以10000就会变成0000就像钟表拨过12点一样又会重新开始。而0000又恰好是0000也就是+0的补码这样一来在存储和计算时-0与+0就相等了。那么1000—1111的补码就是10000—1001,这样可以看出补码中1000并没有使用到

(-1)+(-7)=1001(原)+1111(原)=1111(补)+1001(补)=11000(补)

(-1)+(-7)是-8,而二进制(-1)+(-7)的补码是11000存储4位就是1000,因此正好可以使用多出的(-0)[1000]的位置来表示(-8)[11000],由于存储时的有溢出位的特殊性因此-8是没有反码和原码的。这样一来不仅解决了(-0)的计算问题,同时原本的表达范围(-7)—7也变成了(-8)—7,比原本的表达范围最小值多了一个数值。

这也是为什么在程序语言中数值数据类型的范围定义负数总是比正数多一个数值的原因了。

由于课堂上老师提到了补码,出于好奇,而且觉得还是需要掌握的,所以才查阅的。理解纯属个人观点,如有理解错误还请指出。

参考文章https://www.cnblogs.com/zhangziqiu/archive/2011/03/30/ComputerCode.html

个人博客:https://www.rainc.top/2019/10/10/essay/twos-complement/

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,839评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,543评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,116评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,371评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,384评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,111评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,416评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,053评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,558评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,007评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,117评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,756评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,324评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,315评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,539评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,578评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,877评论 2 345

推荐阅读更多精彩内容