对于一个数, 计算机要使用必定的编码方式进行存储. 原码, 反码, 补码是机器存储一个具体数字的编码方式.html
原码就是 符号位 加上 真值的绝对值, 即用最高位表示符号, 其他位表示值. 好比若是是8位二进制:编码
[+1]原 = 0000 0001 [-1]原 = 1000 0001
由于最高位是符号位, 因此8位二进制数的取值范围就是:spa
[1111 1111 ~ 0111 1111]
即code
[-127 ~ 127]
原码是人脑最容易理解和计算的表示方式.htm
正数的反码是其自己blog
负数的反码是在其原码的基础上, 符号位不变,其他各个位取反.get
[+1] = [00000001]原 = [00000001]反 [-1] = [10000001]原 = [11111110]反
可见若是一个反码表示的是负数, 人脑没法直观的看出来它的数值. 一般要将其转换成原码再计算.基础
正数的补码就是其自己二进制
负数的补码是在其原码的基础上, 符号位不变, 其他各位取反, 最后+1. (即在反码的基础上+1)方法
[+1] = [00000001]原 = [00000001]反 = [00000001]补 [-1] = [10000001]原 = [11111110]反 = [11111111]补
对于负数, 补码表示方式也是人脑没法直观看出其数值的. 一般也须要转换成原码在计算其数值.
补充:负数的补码这么记忆:符号位不变,其余的从低位开始,直到遇到第一个1以前,什么都不变,遇到第一个1后保留这个1,之后按位取反。
好比:-7[原] = 10000111
-7[补] = 11111001
有符号整数,二进制的最高位表示正负,不表示数值,最高位为0时表示正数,为1时表示负数,
这样一来,能表示数值的就剩下(n-1)位了,
好比 char a= -1; 那么二进制表示就为 1000 0001,
1 表示为 00000001 ,因此除去符号位剩下的7位
0 1111111 = 127 ,1 1111111= -127,范围应该为 -127~127 ,
可是问题出来了,教科书上是-128~127 啊,下面就剖析一下这个惊人的奇葩。。。
无符号的整数 用 所有二进制位 来存储。
有符号的整数,最高位是 符号位 ,其他为表示数值。
却带来一个麻烦,当进行加法时, 1 + 1
0000 0001
+ 0000 0001
———————————
0000 0010 = 2
当 1 - 1 ( 计算机只会作加法,因此会转换为 : 1 +(-1))
0000 0001
+ 1000 0001
———————————
1000 0010 = -2 1-1 = -2 ? 明显不对❌
说明:用原码 作 运算是不行的。
解决上面的问题:发明了反码,下面用 反码进行加法计算 1 + (-1)
1 是正数,反码就是自己。
-1 是负数,反码在其原码基础上,符号位不变,其他位取反
0000 0001
+ 1111 1110
——————————————————
1111 1111 由于是反码计算,须要转换为原码: 1000 0000 = -0
说明:反码解决了相减的问题,却又带来一个问题 -0。 -0 == +0 == 0, 一个0 就够了吧。
为了不这个问题,又发明了补码,下面用补码进行加法计算 1 + (-1)
1 是正数,补码就是自己。
-1 是负数,补码在其原码基础上,符号位不变,其他位取反,最后 +1
0000 0001
+ 1111 1111
——————————————————
10000 0000 这里变成了9位,char 为 8位 最高位舍弃,结果为0. ok
https://www.cnblogs.com/zhangziqiu/archive/2011/03/30/ComputerCode.html