更新时间:2025 07 18 15:42:14 作者 :庆美网 围观 : 39次
大家好,关于1的补码;1的补码和运算是什么很多朋友都还不太明白,今天小编就来为大家分享关于的知识,希望对各位有所帮助!
补码(Two\’s complement),是有符号数的一种二进制表示方式。
我们用 B2Tw 来表示一个补码。其中 w 代表二进制数的位长,B2T 的含义其实是 “二进制转补码”。
计算补码实际表示的数,我们需要将每一位上的值和对应权重相乘然后进行相加。每一位(索引记为 i,从 0 开始,从右往左递增)的权重为 2i,但最高位的权重比较特殊,需要取负数,为 -2w-1。
对向量 x = [x^(w-1), x^(w-2), … , x^0],有:
下面举几个简单的例子:
补码其实就是将最高位后面的位当成是一个无符号二进制数,将其转为十进制。然后如果最高位是 1,就再减去 2^(w-1),得到一个负数;
如果最高位是 0,不用处理,最后得到一个非负数。补码这种表示方式使用了减去偏移值(2^(w-1)) 的方式,解决了原码和反码表示的 0 有两种表示方式的弊端,成为现在机器有符号数的标准意义上的存储方式。
对于一个位长为 w 的补码表示,最大值 TMaxw 为 2^(w-1) – 1,此时最高位为 0,其余位都是 1。最小值 TMinw 为 -2^(w-1),此时最高位为 1,其余位都是 0。
如对于 4 位的补码,最大值 TMax4 = B2T4([0111]),对应的值为 2^3 – 1 = 7,最小值为 B2T4([1000]),对应的值为 -2^3 = -8。
补码的英文Two\’s complement,原意是 “2的补数”。
这个命名虽然没有描述补码的定义,但它描述了补码的一个特性:一个补码可以通过被 2w 减去,得到它的相反数,即 -x = 2w – x。
如对于字长为 4 的补码表示 0001(十进制为 1),它的相反数为 10000(即 24) – 0001 = 1111(十进制为 -1)。
我们在学习原码、反码、补码,查阅相关文章时,总是可以看到类似下面的这句话。
正数和0的补码就是该数字本身,负数的补码则是将其对应正数按位取反再加 1。
后半句话难以理解,因为这是我前文提到的特性的一种变体。下面我们来分析这个变体是如何推导出来的。
根据补码特性,字长为 w 的补码和补码的相反数相加,得到的是 2^w,如 0001 + 1111 = 10000(即 24)。
补码和补码按位取反的数相加得到的是 2^w-1,如 0001 + 1110 = 1111(即 10000 – 1)。
用后一个等式减去前者,我们就得到了:
于是我们有了 “负数的补码则是将其对应正数按位取反再加 1” 这个结论。
请务必不要通过这句话来理解补码,它不直观,不是定义,只是一个特性。
而是应该直击本质:除最高位的其他位对应的数,根据最高位的值决定是否减去偏移值(2^w,w 为位长)得到的值就是补码。
既然讲了补码,那不妨再简单讲讲和补码密切相关的原码和反码。原码和反码和补码一样,都是有符号数的表示方式。
原码(Sign Magnitude),由最高位的符号位(Sign)和其余位表示的大小(Magnitude)组成。
原码与我们日常使用的有符号数相似,最高位表示符号(0为正,1为负),剩下的位则是数字的绝对值大小。原码的计算公式为:
反码(Ones\’ Complement),和补码的计算方式非常相似,只是这个偏移值是 2^(w-1)-1,而不是 2^(w-1)。
正数的反码等于其原码,而负数的反码则可以通过保留其符号位,将原码的数值位取反得到。
反码公式为:
反码(Ones\’ Complement),根据英文原意,应该叫做1们的补。“1们” 表示是多个 1,对于一个 w 位的反码来说,其实就是 2^(w-1)-1(全为 1 的 w 位的二进制数)。
同样,类似补码,反码具有特性:一个补码可以通过被 2^w-1 减去,得到它的相反数,即 -x = 2^w-1 – x。
最近看了一些文章说原码、反码、补码。还有一些软考的那些讲师讲解。直接说这样背就没有问题了。完全没有解析背后的原理。下面就是软考的其中一页PPT。写得是没错,但是这样背,很快就忘记了,我想从另外一个方向和你说。为什么会出现原码、反码和补码?他们解决了什么东西。
其实出现这些都是为了方便表示一个负数,而且在实现数的运算的时间更简单。现在计算机表示一个数都是用补码,它解决了+0,-0的问题。
下面用4个比特位来表示数
原码表示:最高位(MSB most significant bit)代表符号位,0为正,1为符。你会发现会有-0(0000),+0(1000),和我们平时生活当中只有一个-0和+0是一样的相违背。然后对一个数进行加法。按我们正常的去做加法,你会发现会结果是错的。
原码表示
明明+1 +(-1)=0,但是你看下面对应的码表是-2.如果想纠正这种结果也可以通常复杂的逻辑组件实现。看结果是不是有点反人性。所以计算机放弃使用这种表示一个数。
以原码方式进行加法
反码表示:这个你是需要记的,反码是将正数取反(也就是翻转它所有位,在硬件层面就是进行NOT运算)。直接上图。你会发现仍然存在一个+0(0000),-0(1111)的问题。
反码表示
做加法是怎么操作的呢,使用循环进位这种方法,如果加法在最高位有溢出,就从最低位加1.如果不理解你再多看一次加粗的话还有再看一次图。如果没有溢出就不用管,但是这样还是比较麻烦,因为要多做一步加1的操作(我看《计算机系统解密》这书上说这样操作加法麻烦,但是我觉得采取补码的表示方法你本来也就要采取码加1的做法,不也是多做了一步加1的操作吗,怎么就说有更简单的方法呢)。但是采取补码运算时方便了。
反码加法
补码表示:对正数取反,也就是对每一位进行NOT运算,然后加1,如果出现进位溢出,那就丢弃。你看0就是(0000),如果你按补码的规则,0000取反就是 1111再加1就是[1]0000,其中1是溢出,那就丢弃,那还是0000,所以完美地0只有一种表示方法。而且原码,反码都出现了两个0,补码只有一个0,所以补码能表示更多数,多在能比补码反码多表示一个负数。
补码表示
书中插图那里我认为不对,-1应该是1111的表示。它想寻找一个-1的表示方法。就是什么数加1会等于0。0的表示方法和1的表示方法已经规定了好了。所以在寻找一个-1的表示方法,然后就得出了补码的规则。所以你知道为什么会出现这些不同码的表示方法了吧。就是为了寻找一个高效的方法(排队奇异,使运算简单)来表示一个负数。
补码加法
现在你已经了对原码,反码,补码清楚了吧。当你遗忘,你想想怎么表示一个负数,能够不出现+0,-0的现象。计算是使用补码来表示的负数的。最后来做几道题来结束吧。
(1)十进制数-48用补码表示为( )
A、10110000 B、11010000 C、11110000 D、11001111
(2)已知X、Y为两个有符号数的定点整数,它们的补码为:[x]补=00010011B,[y]补=11111001B,则[X+Y]补= B
将你的答案写在评论区。
END,本文到此结束,如果可以帮助到大家,还望关注本站哦!
嘿,各位宝爸宝妈们!最近有没有听说过和氏羊奶粉这个神奇的东西?今天小编就来给大家科普一下,让你们对这款奶粉有更深入的了解。不要以为只有牛奶才是婴儿的首选,其实羊奶也是一个
嘿,亲爱的小伙伴们,今天我们要来聊一聊生活百科行业的热门话题——和氏羊奶粉!你可能已经听说过它,也可能对它一无所知,不管怎样,今天我都会给你详细解析它的功效与作用。首先,让我
大家好,今天我们来聊聊生活百科行业中备受关注的话题——“和氏羊奶粉的价格及其影响因素”。作为一款备受消费者青睐的高端奶粉品牌,和氏羊奶粉在市场上备受瞩目。但是随着近
嘿,小伙伴们,今天我们来聊一聊生活百科行业的热门话题——“和氏羊奶粉在国内市场的地位如何?”是不是很好奇呢?别着急,让我来给你揭晓答案。首先,我们会带你了解和氏羊奶粉的发展
嘿,亲爱的年轻爸爸妈妈们!你们有没有听说过和氏澳贝佳羊奶粉?它可是最近备受瞩目的新宠哦!今天小编就来为大家揭秘一下,这款奶粉到底有什么神奇的功效和作用呢?让我们一起来看看吧
用户评论
终于懂了!以前对计算机里的补码一直一脸懵逼,看完这篇你就明白了!最简单的就是1的补码其实就是在原数的基础上反转所有位然后加一。用这种方法算术运算是比较方便的,真棒!
有7位网友表示赞同!
我一直觉得电脑逻辑计算这么复杂,现在才知道原来是1的补码在偷偷运作!感觉自己又学到了一点干货知识!下次再遇到编程问题应该能更有针对性地解决。
有5位网友表示赞同!
讲道理这写太繁琐了吧?本来想快速理解一下1的补码的原理,结果越看越深入了计算机科学的各种概念。建议可以加一些案例和图示,更容易消化吸收。
有8位网友表示赞同!
对码相关知识点的讲解挺详细的,很适合想要深入了解计算机运算机制的人!不过对于小白来说学习难度有点高,可能需要一点基础知识储备才能看懂。
有6位网友表示赞同!
写这篇博文很棒!终于知道为什么1的补码在二进制运算中占这么重要的地位了!学习到真值知识!
有16位网友表示赞同!
这篇文章把1的补码和它的运用方式讲解得非常清楚,特别是针对不同的数据类型进行举例说明,让我更容易理解。感谢作者分享这么宝贵的经验!
有10位网友表示赞同!
说实话,这篇博文还是有点晦涩难懂,我感觉自己学了一堆理论但实际操作上还不太明白怎么使用1的补码。希望可以增加一些实践案例或者代码示例,这样学习起来效果会更好!
有16位网友表示赞同!
终于有人解释1的补码的概念啦!以前总是卡在这里,现在看明白了!简单易懂,逻辑清晰,作者思路非常棒!
有17位网友表示赞同!
我平时学计算机的时候很少接触到1的补码,这次读完这篇博文对它的运算方法和应用场景有了更深入的了解!真是受益匪浅!希望作者能够分享更多有趣的计算机知识!
有8位网友表示赞同!
写的太详细了!我是看博客来的,只想快速了解一下1的补码是什么?结果直接跳进了一个复杂的理论体系,差点累死我了...
有7位网友表示赞同!
我觉得文章的标题有点 misleading ,更像是关于计算机数字表示法的介绍。 实际内容并不仅仅局限于1 的补码本身。
有19位网友表示赞同!
这种表达方式对我来说太抽象了!能不能用一些图示或者动画来辅助讲解,这样更容易理解1的补码背后的原理吗?我的脑容量有限啊!
有20位网友表示赞同!
原来计算机运算也依靠着这样的数学规则!这个1的补码真是太神奇了,简直就是逻辑演算的魔法门户!看完就觉得自己对计算机知识提升了一大步!
有10位网友表示赞同!
我建议在文章开头加上一个简短的概述,快速概括1的补码的概念和重要性。这样可以更好的吸引读者阅读整个博文内容。
有14位网友表示赞同!
我觉得文章组织得很有逻辑,一步一步地引领着读者去理解1的补码的生成、运算以及应用场景。这真是一个系统性的讲解!
有12位网友表示赞同!
以前总是觉得1的补码这玩意特别难懂,看完这篇博文我感觉自己像开了一扇窗,看到了一个全新的世界!原来计算机运算这么复杂却又如此美妙!
有20位网友表示赞同!
这种数学原理解释的太深入了,我只想快速了解一下1的补码的概念而已!下次来点更简单易懂的文章吧,不然我这个小菜鸟根本搞不懂!
有6位网友表示赞同!
这篇博文让我对计算机科学有了更深的理解。感谢作者分享!也希望能看到更多关于1的补码和类似底层知识讲解的文章!
有14位网友表示赞同!