408-计组 2原码、反码、补码、移码的理解-jiku_wang

原码、反码、补码、移码

原、反、补码都是来处理负数的,正数的原、反、补码是本身自己。

1. 数据在计算机中的存在形式:

众所周知数据是以100101010形式存储在计算机中的

数据分为有符号数和无符号数;

无符号数全部为数值位;

有符号数的首位为符号位,0为正,1为负;

为什么会有有符号数的存在,这是自然发展的必然,表示“欠别人的钱的数量”

但这一情况对计算机并不是很友好:

example:

设计算机字长为4bit(只能存放4位)

+1:0001

-1:1001

1+(-1) = 1002  (-2!!!)

这就不对了,所以引出了反码的概念

=====================================

2. 为什么要有反码

首先计算机内部只实现了加法器,并没有实现减法器

所以要想表示 X - Y

就得是这样的形式X + (-Y)

主要的问题是如何来表示 负数!!! 

反码就是来解决这个问题的

反码:

正数的反码是其本身

负数的反码是在其原码的基础上, 符号位不变,其余各个位取反.

特点:

有反码计算得出来的结果依然是反码,需要再次经过取反的处理;

------------------------

先要理解模运算

如图所示当数值太大超过最大位数时,会发生溢出,重新归0;

这是一个机器字长为4的计算机,模为2^4 = 16;

所以其能够表示的范围是0~15

-----------------------------------------

一个负数可用它的正补数来代替,而这个正补数可以用模加上负数本身来得到。

一个正数和一个负数互为补数时,两数的绝对值之和为模

正数的补数为其自身。

-----------------------------------------

现在以计算 5 - 3为例:

 # 按以上理论,减一个数等于加上它的补数,所以
 5 - 3
 # 等价于 
 5 + (16 - 3)   // 算术运算单元将减法转化为加法
 # 用二进制表示则为:
 0101 + (10000 - 0011)
 # 等价于
 0101 + ((1 + 1111) - 0011)
 # 等价于
 0101 + (1 + (1111 - 0011))
 # 等价于
 0101 + (1 + 1100) // 1 + 12
 # 等价于
 0101 + 1101  //13

 # 最后一步 0101 + 1101 等于
 10010

 由于机器是4位所以要溢出1;即
 0010 = 2!!!!

了解模的概念之后,我们接着说反码

---------------------------------

这样带来了1个问题:

(1)有了两个0+0 0000     &  -0   1111

反码得计算举例:

1+(-1)[反] = 0001 + 1110 = 1111;

// 1111在反码中是-0 

6 + (-2)[反]   =  0110   + 1101  =  0011 ;

//0010取反得0100(4), it's  cool!!!

-7[反]  + 2 = 1000 + 0010 = 1010;

1010取反得1101= 5!

======================================

3. 补码的作用

为什么叫补码?

关键在于  “补”  字,complement

因为经过反码得处理有两个0,所以将反码得到得数 + 1;即可消除一个 - 0 (1111)

补码的定义:

-------------

就是在反码的基础上按照正常的加法运算加1。

例如:X=-101011 , [X]原= 10101011 ,[X]反=11010100,[X]补=11010101

PS:0的补码是唯一的,如果机器字长为8那么[0]补=00000000。

特点:

由补码计算得结果同样也是补码

这样就解决了+0和-0同时存在的问题

另外"正负数相加等于0"的问题,同样得到满足

举例,3和(-3)相加,0011 + 1101 =10000,丢掉最高位,就是0000(0)

同样有失必有得,我们失去了(-0) , 收获了(-8)

以上就是"补码"的存在方式

结论:保存正负数,不断改进方案后,选择了最好的"补码"方案

这样我们减去一个数,转换成加上这个数的负数形式

就是要加上这个负数的补码、取反加一。

example:

7 - 3
等价于
7 + (-3)

01111 + 1101[补]  =   10100 (进位溢出)

得到0100 (补码)
取反加1,得到:
0011 + 1 = 0100 ——>4!

4. 移码的作用

计算机中使用补码来计算的,但是补码对于人来讲不是很友好,看不出谁大谁小

故使用移码来处理,就能显示出大小

移码就是在真值X上加上一个常数,2^n   n为字长减1

特点:

只需将补码的符号位取反即可得到移码。

=====================================

参考文章:

https://www.zhihu.com/question/20159860

https://blog.csdn.net/leonliu06/article/details/78685197

over

猜你喜欢

转载自blog.csdn.net/Vast_Wang/article/details/106958220