loading

学习原码、反码和补码

原码

在计算机世界中,一切事物都用二进制来表示。一张图片、一个视频等都用二进制存储在计算机存储器中。

原码符号

人们可以通过数学符号来识别负数和正数,由于计算机一切都是二进制数,所以无法用人类能理解的符号表示正负数。正负数用二进制数来标识,正数是 0;负数是 1,称之为符号位。符号位位于一串二进制数的最高位。

比如,010101110,最高位是 0,0 代表正数,所以这是一个正数。

数学运算

用原码来计算正数与负数的相加有非常大的问题:

十进制 5 - 5 = 0 对应:5 + (-5) = 0

即二进制中:00000101 + 10000101 = 10001010

但是,二进制的结果转换为十进制是 -10,显然结果不正确。

反码

实际上计算机应该用补码来计算,但是负数的补码要经过反码变为补码的步骤,所以这里专门介绍变化的规则。

【规则】正数的原码与反码保持不变。负数的反码就是原码的符号位不动,其余依次取反。比如,10000101 的反码是 11111010。

尝试用反码来计算 00000101+11111010,最后的结果是 11111111。

由于符号位是 1,结果是负数;把反码转换成原码,结果是 10000000,对应十进制数 -0。-0 和 0 有着本质的区别,对应的二进制是 10000000 和 00000000。

所以,计算的结果依旧不正确。

补码

计算有符号的二进制数,最佳的办法就是,用负数的补码计算。

【规则】正数的补码与原码保持不变。负数的补码就是在反码上加 1。比如,11111010 的补码是 11111011。

00000101 + 11111011的结果是 100000000。最后的结果是九位二进制数,舍去最高位 1,剩下部分的符号位为 00000000。

由于正数的反码、补码与原码都一致,所以,原码就是 00000000,对应的十进制就是 0。

总结

直接用原码进行数学运算,很大可能结果不正确。反码以及补码就是避免原码的运算错误。通过上面的例子可以得知,反码还是不能百分之百避免运算错误,比如 -0。只有补码才可以保证运算正确。

posted @ 2022-01-17 01:28  Himmelbleu  阅读(335)  评论(0编辑  收藏  举报