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