颠覆你的认知--重新认识原码、反码、补码

好吧,搁浅了一个多月的文章,总算竣工了。。。。。。。

本来一个多月前就准备写这篇文章了,那时候还在找工作,谁知道换了新工作后的这个月忙成🐶,周末都加班,你们想想有多忙!

说起来写这篇文章的初衷还是因为一次笔试,其中有一道求补码的题,然而我没做出来......讲真,笔试这种东西我觉得考考应届生可以的,没经验,那就看基础,但是对于工作过几年的人再不管三七二十一笔试题先奉上,多少都有点没诚意吧,当然最关键的不是笔试本身,而是笔试内容,全是一些概念理论和面试宝典上的题目,真的很想摔笔走人!

拿这道题目来说吧,没有难度可言,但是毕业后再没接触过,难免会忘记,所以不懂这些题的意义何在,当然了,对于大神们来说这些应该还是小儿科了,咱还是能力不足啊,这不,回头就补了下这块知识点。

原码,反码,补码

先出几个题吧(8位的情况下):

1. 127的原码、反码、补码分别是什么?
2. -127的原码、反码、补码分别是什么?
3. 0?
4. -128?
5. 128?

如果以上题目你都会了,那么,恭喜你,下一篇文章你可以关注下,也许有你还不会的;如果这些你都不会,那么老老实实的看下去吧......

首先介绍一下概念,其实也不算是概念,只是一种记忆方式:

正数的原码、反码、补码都是这个数的二进制表示,三个码是一样的!以下规则针对负数才有用!!!

原码:一个数的二进制的表示,最高位表示符号位,最高位0为正,1为负,也是我们最容易理解的一种方式

反码:将原码的所有二进制位取反,符号位不变

补码:反码的基础上加1

有了以上基础后我们可以来做题了。

第一题:127

127的三个码:首先127是个正数,所以,直接算出他的二进制01111111,也就是它的三码

第二题:-127

首先它是个负数,计算它的原码,只要将第一题127的符号位改成1就是了,所以-127的原码是11111111,反码是符号位除外取反,所以反码是10000000,补码是反码的基础上加1,所以补码:10000001,没毛病。

第三题:0

等等,0是个什么鬼啊?正数还是负数啊?算了算了,pass掉,下一题吧

第四题:-128

嗯,这个是负数,我会的,先求它的原码,也就是,也就是......好像哪里不对啊,好像没有这个数的原码啊,除去符号位,最大也就127了,一定是溢出了,对,肯定是这样的......不好意思,遗憾的告诉你,这个数在计算机里并没有溢出,因为计算机是用补码来表示数的,而-128确实能用补码表示出来,具体是什么下面再说,我们还是先看下一题吧。

第五题:128

!!!什么鬼,又来一个。好吧,别紧张,这个确实是溢出了。

做完以上题目是不是发现这些边界值好难记,好绕(其实是我在绕你们而已),为什么要这么绕,我觉得很多资料都是画蛇添足了,为了计算补码而多出来中间的反码和转换步骤,然后我们就乖乖的按着这个步骤计算就完事了,也不用关心是为啥,反正答案出来就行了。但这样的后果就是时间一长就忘了,特别是一些临界值和特殊值。

其实在计算机中或者说机器语言中是没有负数这个概念的,我们所说的负数和符号位只是为了我们人类的认知而自己定义的,对于计算机来说,只有正数,这是其一;其二,计算机中也没有减法,它只会做加法,当然这个加法也是人为的设定,当我们需要做减法的时候我们只能换成加上一个负数,因此也就有了在计算机中表示负数的需求,然后我们就规定最高位作为符号位并且参与运算,但计算的时候得先换成补码,这就是这些中间概念和过程的来源。
知道了补码的来历后我们还需要知道一个知识点,就是模。其实就是一个溢出舍去的过程,举个🌰:时钟一圈是360度,当然我们也可以用361度来表示,但实际上它和1度是一样,所以在这里模就是360度。那-30度呢?这种情况下我们逆时针转30度和顺时针转330度结果是一样的,所以我们就把-30变成了加330,这也是模的意义所在,利用模,可以将减法变成加法,可以将溢出部分舍去而不改变最终结果。

以上的概念只是我个人的理解,如果错误或者不合适的地方还请指出。

基于上面两个知识点,我们来看计算机中的形式。

假定一个前提:单字节的运算(也就是8位)
单字节运算中我们的模即是256(2^8),在没有符号位的情况下我们计算下127+2等于多少,结果是129,没有溢出,二进制表示为10000001,一切顺利。这时,如果我们将最高位当做符号位会怎么样呢?127+2结果仍然是10000001,那么结果是-1?要知道计算内部是用补码来表示数的,所以这个10000001是一个数的补码。那么我们倒推一下,明显这个是一个负数,负数转补码是原码取反加1,所以我们减1取反就是原码了,所以这个负数的原码应该是11111111-127!可以看一下题2作为验证。

绕了这么多,感觉自己都有点乱了,这里直接给出结论:

计算机中负数的补码就是模减去这个数的绝对值

-127这个负数,在计算机中就是129,也就是256-127 = 129。为什么正数的补码等于原码?因为计算机中可以直接表示正数。为什么负数的补码需要转换?因为计算机中没有负数,只能用另一种形式来表示负数,也就是通过模运算得出的一个相同作用的数,即我们所谓的补码。

回头再来做一次我们上面的题目:第一题127,正数,没变化;第二题-127,负数,256-127=129,即10000001,上面举例论证过了;第三题,0,不管正负,计算机中可以直接表示出来,所以原码补码都是00000000;第四题:-128,256-128=128,所以补码就是10000000,很特殊,它并没有原码,但是没关系,计算机不认原码;第五题:128,上面我说了这个数溢出了,虽然它在计算机中可以表示,也就是10000000,但是我们人为的将这个值当做了-128,所以在计算机中正数最大能到127,负数最小能到-128,也即补码的区间,即8位bit能表示的最大数量255个数。
再次申明:本文中涉及的所有数字和运算都有一个大前提那就是8位bit下的值

至此,我想表达的都已经说完了,可能大部分人看了会觉得更晕了,其实我在写的时候好几次都把自己绕晕了,所以部分表述不清楚或者不正确的地方请大家及时指出,否则误导了读者就罪过大了。当然一下子没理清楚的也可以多读几次,先抛弃原先的认知,按这我的思路来,应该会好理解很多。

文章开头说了,会有下一篇文章,本来是打算放一起写的,但是发现这些内容都挺无聊的,太长了估计看不下去了,所以决定另起一篇再写,先透露下是关于二进制小数的表示、进制转换和进制的各种运算的,有兴趣的小伙伴可以关注下~~~

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

推荐阅读更多精彩内容

  • 本篇文章讲解了计算机的原码, 反码和补码. 并且进行了深入探求了为何要使用反码和补码, 以及更进一步的论证了为何可...
    yang2yang阅读 2,216评论 1 13
  • 书中关于原码、反码、补码和移码的定义如下(n是机器字长):原码: 反码: 补码: 移码: 原码, 反码, 补码的基...
    困卡阅读 15,648评论 2 8
  • 一. 机器数和真值 在学习原码, 反码和补码之前, 需要先了解机器数和真值的概念. 1、机器数 一个数在计算机中的...
  • 筹备已久的“爱心树父母学堂”公益讲座一一“做智慧父母,帮助孩子接好小学第一棒”,于今晚7点30分,准时在5...
    慢曼说阅读 319评论 0 0
  • 今天花了9块9买了一个耳机,本来原来的价格是99的,之前也挑选过几个,铁三角、魔声的,但是上网仔细查找了一下,ip...
    OO碰到OO阅读 210评论 0 0