原码、补码、移码
首先:
原码,反码,补码的引入是为了解决计算机做减法的问题。
(下面举例都是 8 位)
1. 原码
原码:是最简单的机器数表示法。用最高位表示符号位,‘1’表示负号,‘0’表示正号。其他位存放该数的二进制的绝对值。
正数原码 : 7 :0000 0111;【x】+
负数原码:-7:1000 0111;【x】+
0 分为 +0 和 -0
但是计算机在用原码直接计算的时候会有问题,例如:
0000 0001(1) + 1000 0001(-1) = 1000 0010(-2)
就是说正数加负数会出现问题,也相当于正数减法出问题。
2. 补码
因为计算机数字都是有固定位数,也就是说有个一最大值,超过这个值就会溢出。每次结果相当于都会取余最大值。在取余运算中加上一个负数就等于加上这个负数对余数的模数。
假设 10 为最大值。 4 + (-2) = 4 + (10-2) MOD 10 = 4 + 8 MOD 10 = 2
这里 (10-2)就是(-2)的模数。对应到二进制,就是负数的补码。通过补码,减法就转化为了加法。
正数补码: 【x】+
负数补码: 【x】+
0 补码:0000 0000
负数求补码方法:
- 符号位不变,其他位取反加 1
- 符号位不变,从右边第一个 1 之前不变,其他取反
3. 移码
用补码虽然计算简单,但是要判断两个数的大小不能很直观的看出,因此有了移码:
移码:【x】+ ,
它使在一定位情况下,最小的负数变为 0,最大的正数变为(111…111),方便比较大小。
计算:补码符号位取反