简述
二进制数字表示法三兄弟:
- 原码
- 补码
- 反码
原码就是原来的编码,就是字面意思,而补码和反码比较奇怪,为什么需要这两种编码,意义是什么?
原码
原码表示法,正数没有区别,负数首位为1
。
3
的原码 0000 0011
-3
的原码 1000 0011
这个就这么简单,没什么可说的。
补码
这个是操作系统在对负数
进行计算时的一种策略。
作用:解决二进制下表示负数的问题。
为什么需要补码,是什么情况下需要使用到补码。不用行不行?
不行
因为使用两个原码
做加法,没法运算!!
不用行不行?
不行,不用玩不了。因为两个原码
在二进制下无法做加法!!
使用二进制的第一位表示数字的正负位:
0表示正数,1表示负
数。
原码加法
原码
之间无法直接进行计算,举个反例
2 (-2) 结果应该是0,但是如果直接使用原码进行计算,结果溢出
代码语言:javascript复制0000 0010
1000 0010
---------
1000 0100
结果
期望是: 0
实际为: -4
现在解释为什么需要补码
为了得到正确的计算结果!! 如何能得到正确的计算结果?
再举个例子,这次是正确的例子: 2 (-2) = 0 转换成二进制:
代码语言:javascript复制0000 0010
???? ????
---------
0000 0000
结果 0
也就是说,第二行?
是什么样的二进制,才能得到正确的结果,才是关键!!
反码
其实已经有了结果了,那可以从结果中求和?
的结果。
要得到补码,就需要反码
参与通过反码
算出补码。
推导过程
还是:2 (-2)
代码语言:javascript复制0000 0010
1111 1110 <-- 十进制(-2)在计算机中真正的表示形态,即,补码
---------
0000 0000
负数计算补码步骤: 1.计算二进制的绝对值,即,该数除符号位之外的二进制有效数据位,符号位是要保留的。 2.按位取反 3. 1
1.计算二进制的绝对值
-2
的绝对值,就是正2:
1000 0010 # 最高位保留符号 1
2.取反
这个就是反码
代码语言:javascript复制1111 1101 # 注意,上面说了,符号位是要保留的。
3.最后进行 1
代码语言:javascript复制1111 1110
这个最终结果就是:补码
总结
有点繁索,但过程就是这么个过程,实际使用中无感知,但是必须了解这个原理,这也就是为什么 127 1=-128的由来。
代码语言:javascript复制0111 1111
0000 0001
---------
1000 0000