知道 补码,如何 计算 原码

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了知道 补码,如何 计算 原码相关的知识,希望对你有一定的参考价值。

两种计算方法:

算法1: 补码=原码取反再加1的逆运算
10010110是补码,应先减去1变为反码,得10010101;
由反码取得源码即除符号位外其他为按位取反,得11101010,即十进制数的-106

算法2:负数补码速算法,由最低位(右)向高位(左)查找到第一个1与符号位之间的所有数字按位取反的逆运算
10010110是补码,符号位与最后一个1之间的所有数字按位取反,得11101010

两种算法得出同样结果
参考技术A 这个,不好说。
补码、原码,并非是一一对应的。
比如,-128 具有补码 1000 0000。
但是,-128 并没有八位的原码。
这就,没法计算。
参考技术B -128 只有八位的补码,是:1000 0000。
-128 却没有原码和反码。
所以,无论如何,你也不能从补码,求出原码和反码。

原码,补码,反码

计算机中所有的数据运算和数据存储都是补码的形式。

正数的原码,反码,补码都相同

负数的原码符号位为1(标识为负数),反码是对其原码逐位取反(符号位除外)

负数的补码通过在其反码的末尾加1得到

技术图片

为甚采用补码计算呢?

由于计算机计算是在cpu中进行的,cpu中只有加法器,没有减法器,没法直接做减法运算,

我们知道,负数的表示符号位是1,(而补码的设计就是为了让符号位也参与运算)符号位同样参与运算

例如:9 - 2 = 9 + (-2)

原码:9   0000 1001

   -2  1000 0010

+              1000 1011 (-1)

反码: 9  0000 1001

   -2  1111 1101

          +(1)0000 0110   (6)

补码:9 0000 1001

          -2 1111 1110

         +(1)0000 0111   (7)

可以看到,通过补码运算得到了想要的结果。

为什么要这要设计补码呢?(或者说补码设计的原理什么呢?)

9 - 2 = 9 + (-2)

例如字长为8,8个二进制位共可以表示2^8(256)个数字,包括符号位

表示范围0-->127(0111 1111)-->-128(1000 0000)-->-1(1111 1111)-->0(补码表示)

-128(1000 0000),符号位为1,转换成原码(减1取反)(0111 1111)-->(1000 000)

(1000 0000)好像是-0;事实上-128没有原码和反码(8位)(计算机中规定-128补码为1000 0000),计算时扩展为16位来计算(1000 0000 1000 0000);

 

可以看出数值变化是0-->max-->min-->-1-->0;

所以通过同余,可知-128 = 128(mod 256);

比如时钟模为12,顺时针转动为加,逆时针为减,那么9+2=11 (9 - 10 = 11)

即2mod12=2;-10mod12=9;--> 2 = -10  (mod12)(就像到8位二进制溢出一位从max到min重新开始)。

 

(写的有点乱,。。。。。)

以上是关于知道 补码,如何 计算 原码的主要内容,如果未能解决你的问题,请参考以下文章

原码反码补码的理解与思考

原码反码补码的理解与思考

计算机基础-原码反码补码

原码反码补码

知道 补码,如何 计算 原码

为什么要用补码,反码