原码、反码、补码、移码
原、反、补码都是来处理负数的,正数的原、反、补码是本身自己。
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