皇冠新体育APP

IT技术之家

皇冠新体育APP > 硬件开发

硬件开发

如何通俗地理解原码、反码和补码_孤独的单刀

发布信息时期:2023-08-25 16:19:25 硬件开发 55次 标签:计算机原理 二进制 皇冠新体育APP:fpga开发 Powered by 金山文档
如何通俗地理解原码、反码和补码...

进制是什么?

进制是人为因素设计的概念的五套带进制计数器最简单的方法,例如平常用的十进制,还是0-9这10个大概的数字,这一天十便会向地位进一。鉴于全人类只是十根小指,那么先天地便会想起用十进制--数到10出现 小手指不够了了,就就只能进位了。

你想买的某块显卡价格是 ¥2875,那你大概率会把这个价格读作:二千 八百 七十 五 ,而不是简单的:二 八 七 五 。这说明不同位置的数字都代表着不同的含义--由于进制所产生的。如果没有进制的出现,那你今天可能要用某个奇怪的汉字来描述“2875”这个数字(不过没有进制大概率也不会有显卡)了。

当然也有不带进制的计数方法。比如史前人类所用的结绳记事法----每过一天,就在绳子上打一个结,通过数绳结的个数就可以知道天数。

又比如小时候选班长唱票用的写“正”字计数法,通过统计“正”字个数就知道谁能当班长。

为什么计算机使用2进制?

二进制是逢二进一,这后果着在二进制体统中总是有二数个--当然了目前我掌握是“0”和“1”,虽然为这些?为这些是不“1”和“2”?又又或者同一? “0”和“1”应该客观地能够理解成“不会有”和“有”,确实你也应该用另一个自然数来标识,只能不会有这个客观只不过。 “不会”和“有”是那宇宙空间最常规的多种动态,像是“灯走了和灯没开”、“吃久和没吃”、“睡了和没睡”······ 三天两头有人会说“你是肖特基二级管吗?”----意味这人只是异向思维,跟肖特基二级管只是异向导通一个。但要即是“通(有)”,但要即是“断(找不到)”。 统计机在设备上都可以比较简单地看作是由硫化锌管等数值手机用电线路所组合的。数值用电线路的另一个优势即是它只剩下这两个总体的的状态:“通”和“断”,这不仅与二进制无极限顺应。

什么是原码?

你的Windows操作系统可能是64位的,又或者是32位的?那么这2个数字意味着什么?

64 和32指得是CPU的字长,即CPU每次能处理64位或者32位的二进制数据。后文为了简化理解,我一概将CPU字长假定为8位,所以你现在只能使用8位Windows了。

对是一家数,运算机都要便用肯定的编写代码方案实现贮存和处理,而原码即是在当中有一种编写代码方案。浅显来分析,原码会看作是一家数的2进制说明类型。如十进制数11导出成二进制数即是:11--0000_1011,任何类推。在8位字长下,能说明的2进制数依次是0000_0000--0000_0001--0000_0010--·····--1111_1111,即十进制的0-255。

这种表示方法有个问题就是无法表示负数。严格来说,在十进制中要表示正数应该在前加正号,比如数字 正五 = +5,而负数表示则应加上相应的负号,如数字 负五 = -5。正负号就是我们用来区分数字正负的一种方式。现在糟了,人类可以分“正负”,但是计算机只有“0”和“1”啊,并没有“正”和“负”,那么计算机要怎么表示负数?

把8位字长的某一位(通常可以看做是最高位)拿出来,用“0”和“1”分别来对应“正”和“负”不就完事了吗?比如:

负五:-5 = 1000_0101
负三:-3 = 1000_0011

这解决了负数的表示问题,却引入了新的问题:0000_0000和1000_0000居然分别表示+0和-0?嗯?这也太反数学了吧?我们都知道0既不是正数也不是负数,那这会咋有一正一负两个0了?

故障 而且还会有在来计算上:
正数 + 正数:理论上(+1) +(+1) = +2 ;实际上0000_0001 +0000_0001 = 0000_0010,即+2--结果无误。
负数 + 负数:理论上(-1) +(-1) = -2;实际上 1000_0001 + 1000_0001 = 0000 0010,即+2--结果错误。
正数 + 负数:理论上(+1) +(-1) = 0;实际上 0000_0001 + 1000_0001 = 1000 0010,即-2--结果错误。 由此可见,仅仅算起中显示了负数,随便通过原码算起报告就都已经不不靠谱了。 或许我们人类文明做某些测算的数学思维是:
正数 + 正数:1、直接做加法。2、最终符号为正号。
负数 + 负数:1、两个数的绝对值做加法;2、最终符号为负号。
正数 + 负数:1、判断两个数的绝对值大小;2、用较大的绝对值 - 较小的绝对值(减法运算);3、最终符号取绝对值较大数的符号。

在上面的计算中,我们把 正数减正数 的减法转换成了 正数加负数 的加法,这样做的原因是可以和计算机内部的加法电路统一起来。

算起器内外部其中概率达到加退位退位减法电线,其实要加退位退位减法而分次融合电线无外乎会扩大生产成本和程序有难度性,任何人民尽概率去想心思把乘法和加退位退位减法用套电线给达到。与此同时,至高位的标符位也体验了算起,同时是要一致性达到电线。

什么是补码?

教材前一个般就说:负数的补码是其反码+1。这只告知你了你们为些什么求补码,但没告知你你们补码到达 是个些什么方面?依于反码,我短时间决定没需要计划方案。不及仔細聊聊机械表。

与忽略道你们之间有木有有注意力过,为一些可以说拥有的机械机械钟皆是12整个精确度却免去0整个精确度?可是这俩不只是 同个个日期吗?机械机械钟可以说皆是用的12小内制,而1天却有24个小内,所以说纵然后面的日期显现是5点,仅是我却没办法掌握详细日期到达 是晚上还是要中午。 选用现阶段咱们可以把这类机械钟从5:00(再选用这都是最新准确时间)整改到2:00,都应该如何做呢?方法步骤有五种:

(1)逆时针调表法

逆时针方向将时针从 5 调整 到 2,这样时针走过的小时数是 5点到 2点共3个小时。

(2)顺时针调表法

顺时针方向将时针从 5 调整 到 2,这样时针走过的小时数是 5点到12点为7个小时,加上12点(即0点)到2点的2个小时,共7+2=9个小时。

两种方法都可以达到同样的目的,而且这两种方法时针所走过的时间数刚好是一个钟表的最大刻度--12小时(3+9),这是巧合吗?

某种程度上,逆时针调表可以看做是一个减法,即 5 - 3 =2。而顺时针调表则可以看做是一个加法,即5 + 9 = 12 + 2 = 14,而14 就是24小时制中的下午2点。这说明在12小时进制中,14和2的意义是一样的!!!同时还说明,减法可以通过某种形式转换成加法!!!

減法换为成乘法是是有限的制条件的,即这点进制操作系统是有要明确功率的。假说特定手表是无穷大,也可是说它能数字代表的周期标尺是非常,如此你始终无法 还经由顺时与逆时针的调表方式来变现不同个感觉了。

机械钟表是可以视为不是个很简单的12进制体统,它所采用了的数据8化我这里的英文也是借助两下16进制的数据8化,即0-9,A(十进制数据8化10)和B(十进制数据8化11),如此十进制数据8化14在12进制肯定是12--左面的1提出1*12=16个半小時,而右方的2则提出2*1 = 6个半小時,加在一起也就是12 + 2 = 14半小時。 现阶段变回顺闹钟调表的的问题,举个例子顺闹钟转到2:九零后,再顺闹钟转了1圈,效率是是一件的?丝毫没有异议,倘若仍是时钟刻线2,但在数学知识实际意义上倘若开始是 5 + 9 + 12 = 26了,26用12进制来写出只是22--下方的2写出2 * 12 = 24个1天,而下方的2则写出2*1 = 1个1天,加在一起只是24 + 2 = 261天。虽然,就能够类拉到转二圈的10进制的381天 = 12进制的32,转三圈的10进制的501天 = 12进制的42······ 12进制的02--12--22--32--42这几条数码在最便宜位边上是2,而是更高的位每加1则预兆着时钟多转了1圈。虽然时钟它会告知你它转了几下吗?就不会,所有12进制的是更高的位这款数码对待时钟的在使用是不现实的含义的,它非常的于被舍去了。

到现在各位看出在有限责任数量範圍内行用乘法来控制加退位减法,故回頭看到确定机的2进制加退位减法。各位从未控制从5到2这款时,即十进制的 5 - 3 = 2,又亦或说 5 + 9 =14 =12 + 2。

十二进制的 5 - 3 = 2,在二进制内是 0000_0101 + 1000_0011 = 1000 1000,结果为 -8,显然不行;十二进制的 5 + 9 = 14 = 12 + 2 = 2(舍去最高位表示的12),在二进制是0000_0101 + 0000_1001 = 0000_1110,结果为14,同样不行。

咦?奇葩,都是除法转进位加法吗,为何毕竟仍然步行?

问题出现在加数9上,在表盘中加9,是因为减3所走的刻度和加9所走的刻度刚好是一个钟表一圈的刻度(即容量)。走上一整圈,钟表时间向虚拟的高位进位后,才会发生虚拟的高位被舍弃现象!

现在我们做减法的不是12容量的钟表了,而是8位字长的二进制数,那么容量是多少?很简单,2^8 = 256(即0-255这256个数字)。所以,此时就不应该加上9(12 + |-3| = 9)了,而是应该加上253(256 + |-3| = 253)了,即二进制的 1111_1101。所以5-3 可以转换为 5 +(256-3)= 5 + 253 = 258 = 256 + 2,即二进制的1_0000_0010,这个结果有9位,但是我们的CPU只有8位,所以最高位也会被舍去,即最终结果为2进制的0000_0010----10进制的数字2,结果正确!

全部补码是为了能让将退位减法生成成乘法的某种人因規定的对负数的项目编码内容。

补码的英文名是 Two's complement ,粗暴点翻译就是 2的补集。这一点可以从其推导方式看出来,负数的补码 = 容量 - 负数的绝对值。比如8位字长CPU能表示的最大容量为 2^8 = 256,所以-1的补码是256 - |-1| = 255,即1111_1111;-15的补码是 256 - |-15| = 241,即1111_0001,其他类推······

什么是反码?

正数的反码一般认为是它自身,当然也有人说反码对正数没有实际使用意义,正数就不存在反码(我对此持赞同意见)。

负数的反码实行有两种方式来源:
说法一:负数的反码是将负数原码中除符号位以外的所有位按位取反,例如十进制数-42的二进制原码是1010_1010,所以反码是 1101_0101。
说法二:负数的反码是将其绝对值对应正数的原码的所有位按位取反,例如十进制数-42的绝对值为42,其二进制源码是0010_1010,所以反码是 1101_0101。(我个人比较赞同这种说法) 不管表述一和表述二,没想到也是一个的。

任何一对绝对值相同的正数和负数,其正数原码与负数的反码相加,其值都是全1。例如+42原码是 0010_1010,-42的反码是1101_0101,加起来就是1111_1111。很显然,出现这种情况的结果是因为,这两个数的每一位都是相反的,我想这可能也是反码这个中文译名的由来。

反码的英文名叫Ones' complement,粗暴点翻译就是 1们的补集 或者 多个1的补集。反码本质上是在求一个正数的算术负数,也就是说,将数字的所有位取反产生的结果与从 0 中减去该值的结果相同。

在上节中,我们说到,负数的补码 =容量(模) - 负数的绝对值 ----式①。

好小伙子,之前要说很长时间补码的诞生这就是成了把退位加减法换算成加加减法来优化用电线路,结论这里英文又需用依据退位加减法来求一名数的补码,搁这套娃呢?别操心,不一定反码就展现功能了。

8位字长下,任何一个负数与其反码相加结果均为全1,即 正数原码 + 负数反码 = 1111_1111。8位字长下容量是1_0000_0000,即2^8 = 256,而1_0000_0000 = 0_1111_1111 + 0_0000_0001。也即 容量(模) = 1111_1111 + 1 = 正数原码 + 负数反码 + 1 ---式② 。

联系①②式:

负数的补码 =容量(模) - 负数的绝对值 ----①

容量(模)= 正数原码 + 负数反码 + 1 ---②

所以 负数的补码 = 正数原码 + 负数反码 + 1 - 负数的绝对值 = 正数原码 + 负数反码 + 1 - 正数原码 = 负数反码 + 1,这也就是我们常说的:负数的补码等于取反 + 1 。这样就也把对负数求补码的运算在电路上给转换成了 按位取反 和 加法(+1) 运算了,这是数字电路很容易实现的形式。

事实上,根据取反+1来求一个负数的补码只是一种简便方法,而并不是一般定义。一般定义仍是 负数补码= 模(容量) - 负数对应的绝对值。接下来我们就会发现一个数无法使用取反+1的方法来求得。

-128的补码为什么是1000_0000?

在8位字长中,通过 原码 = 补码取反 + 1 和 补码 = 原码取反+1的方法可以求得大多数负数的原码和补码,只有一个例外,即-128的补码是1000_0000。因为-128在8位字长下是不存在原码和反码的。

原码的表述位置是-127~127,另外具有+0 = 0000_0000,-0 =1000_0000。反码的表述位置也是-127~127,另外具有+0 = 0000_0000,-0 =1111_1111。 而在补码中却找不到+0和-0,而必须一款0,即0000_0000,那样在补码中多了其中一个来的一款数会写出有什么?参考答案需要注意一点是-128。

从补码的定义看,-128的补码 = 模 - |-128| = 256 -128 = 128,即二进制的 1000_0000。

数学连续性上看,正数是:

0000_0000 = 0; 0000_0001 = 1; 0000_0010 = 2; ~~~~~~~~~~ 0111_1110 = 126; 0111_1111 = 127; 而负数则是: 1111_1111 = -1; 1111_1110 = -2; 1111_1101 = -3; ~~~~~~~~~~ 1000_0001 = -127; 1000_0000 = -128;

所以-128的补码天然就是1000_0000,而非人为定义。同时,在8位字长下,-128是不存在原码和反码的,自然也就谈不上使用 取反+1 的方法了。


  • 📣您有任何问题,都可以在评论区和我交流📃

  • 📣本文由 孤独的单刀 原创,首发于CSDN平台🐵,博客主页:wuzhikai.blog.csdn.net

  • 📣您的支持是我持续创作的最大动力!如果本文对您有帮助,还请多多点赞👍、评论💬和收藏?