补码那些事

补码的作用

负数转化为补码时除符号位外取反加一
因为+0和-0都为零,但是其反码又不同浪费了存储空间,于是补码解决了-0的问题从而将二进制100000000指定为-128,所以1Byte范围是-128~127。

首先谈谈补码与原码的转化

补码是变化负数的(取反加一)
但是负数的补码变化回原码却可以取反加一或减一取反结果一样
这是为什么呢???
对于先减一再取反肯定没有疑问
但是对于先取反再加一就不太理解了
于是原因如下:
补码减1后加上原码是全为1的二进制,
这就像一个满的容器(max=补码-1+原码),而加上1后将补码直接取反则会得到(max-补码=原码-1);
因此将补码先取反再加一可以实现对应原码的转化

接下来便是补码的加减法

前提二进制x+y不会溢出
加法:【x+y】补码=【x】补码+【y】补码
减法:【x-y】补码=【x】补码+【-y】补码
有了前面的思路,于是理解补码运算便容易一些了
正数运算和二进制一样
最难的是负数运算;

x和y都为负数时

思想:max-x-y+1=2*max+1+1-x-y=>max+1-x-y;(因为max会溢出所以不会参与运算)等式成立
x=xxxxxxxxxxxxxxxxxxxxxxxxxXXXXXXXX(x为x的补码)
y=YYYYYYYyyyyyyyyyyyyyyyyyyyyyyyyyy(y为y的补码)
x+y=YYYYYYYxyxyxyxyxxyxyxXXXXXXXX(xy为[x+y]补码-1)
x补+y补=max+xyxyxyxyxxyxyx+1+1;(max+1溢出);

当一正一负时

根据max恒定性得到补码增源码减(补码大多少,原码(绝对值)就小多少)的特点
当正大于负绝对值时,会通过溢出max(符号位也会变化为0)来达到使正数减去对应负数的情况
当正小于负绝对值时,补码会变大因为max的恒定会使原码负数绝对值变小(因为不会溢出所以符号位还是1)
补码那些事