原码,补码和反码总结

原码

在计算机中,除了unsigned的数据类型,二进制数的第一位是用作符号位。正数用0表示,而负数用1表示。因此,32位的int类型的表示范围便是(去掉一位符号位):

$[2^{31}−1,−2^{31}]$
而原码就是符号位加上真值的绝对值, 即用第一位表示符号, 其余位表示值。比如如果是8位二进制:
$[+1]_{原码}=00000001$
$[−1]_{原码}=10000001$

反码

讲完了原码讲反码,反码的表示方法为:
正数的反码:就是它本身。
负数的反码:除符号位外,通通按位取反。
比如刚才的8位二进制数:

$[+1]_{反码}=00000001$
$[−1]_{反码}=11111110$

补码

再说到补码的表示方法:
正数的补码:依然是他本身。
负数的补码:在反码的基础上加1。
又比如刚才的8位二进制数:

$[+1]_{补码}=00000001$
$[−1]_{补码}=11111111$

举栗子

补码就是计算机储存数据的方法,因此,对于一个byte类型来说:

$[a] = 127,[a_{补码}] = 01111111$
$[a + 1] = [127]_{补码} + 1 = 01111111 + 1 = 10000000$
$[b]_{补码} = 10000000$
$[b]_{反码} = 10000000 - 1 = 111111111$
$[b]_{原码} = 10000000 = -128$
$故127 + 1 = -128$