原码、反码和补码都可以作为计算机中数值的编码形式,而目前通用的是补码,那么为什么不是原码和反码呢?
1 计算方法
原码、反码和补码的计算公式很容易理解,原码就是符号位+绝对值,正数的反码等于原码,负数的反码在原码的基础上,符号位不变,其余各位取反,补正数的补码等于原码,负数的补码等于其原码+1.
2 为什么要用补码作为计算机中数值的编码形式
人脑最容易理解原码,人脑会自动识别符号位和绝对值位进行运算,但对于计算机电路,辨别符号位会让电路变得更复杂,因此就想到,如何让数值的符号位也参与运算?
首先原码做不到这一点,1 - 1 = 0 = [00000001]原 + [10000001]原 = -2.
于是出现了反码,1 - 1 = 1 + (-1) = [00000001]原 + [10000001]原 = [00000001]反 + [11111110]反 = [11111111]反 = [10000000]原 = -0,绝对值对了,但符号位似乎不太对,原因在于0在反码中有两种表示方法.
于是,补码出现了,1 - 1 = 1 + (-1) = [00000001]原+ [10000001]原 = [00000001]补+ [11111111]补= [100000000]补 = [00000000]补 = [00000000],这样绝对值对了,符号也对了,同时还可以表示-128.
至于背后的数学原理,有空的时候单独出一期随笔
本人研究牲一枚,敬请各位大佬批评指正~~~
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理