原码,反码,补码

在做题的时候遇到了相互转换的问题,于是在此做一个小结。
原码,即为数直接转换为二进制后的编码。负数与正数的差别为负数最高为为1,正数为0.
正数的反码和补码与原码相同。负数的反码为除最高位全部取反。负数的补码为反码加一。
如:
-5,原码1000 0101,反码1111 1010,补码1111 1011.
-0,原码1000 0000,反码1111 1111,补码0000 0000.

127 原码0111 1111,反码0111 1111,补码0111 1111.
-127 原码1111 1111,反码1000 0000,补码1000 0001.
我们发现,1000 0000这个状态没有使用。如果我们把它当作补码。
最高位为1,所以是负数,相应的反码0111 1111. 相应的原码1000 0000.
所以,1000 0000可以表示-128的补码。

因此,int(32位)取值范围为$-2^{32-1} – (2^{32-1}-1)$