一、基本概念
在计算机系统中,数值一律用补码来表示和存储。原因在于,使用补码,可以将符号位和数值域统一处理;同时,加法和减法也可以用补码统一处理。此外,补码与原码相互转换,其运算过程是相同的,不需要额外的硬件电路。
- 原码:二进制表示。二进制首位是符号位,0为正,1为负
- 反码:正数,反码和原码一样;负数,符号位不变,其他各位取反
- 补码:正数,补码和原码一样;负数,反码末位加1,有进位则进位,但不改变符号位
二、举个例子:(假设是字节长度为8位)
三、注意:(总结一下就是,-127~127都是正常转换,只有-128一个特殊的只有补码)
- 八位字节的二进制转化的十进制的最大 正数 为 127(0111 1111)
- -127只能表示(原码1111 1111)(反码1000 0000)(补码1000 0001)
- 八位字节的二进制转化为十进制的最大 负数 为 -128 (1000 0000)
- +0和-0的补码是一样的。即 0的补码只有一种表示
- 所以为了避免面混淆,有了-0的原码,便不能有-128的原码反码,这是8位比特位位数限制决定的
- 补码能表示的数的个数中,比原码反码少了一个,所以补码可以多表示一个真值为-128的数
这里有一个很好的文案,可以看看:
https://www.cnblogs.com/flowerslip/p/5933833.html(关于 -128 ,+128,-0,+0,-1 的反码补码)
# 但是在(三.-128的补码为什么是1000 0000)的数学方法的证明那里有个正负好像有点问题
四、比如求解 -127+128 = -1
(两者补码想加,然后转成反码,再转成原码,在把这个二进制转成十进制)
补码相加:0111 1111 + 1000 0000 = 1111 1111
转成反码(末位-1):(1111 1111)--> 1111 1110
转成原码(除符号位之外按位取反):(1111 1110)--> 1000 0001
转成二进制:(1000 0001)--> -1