原码,反码,补码
原码
原码:十进制数据的二进制表现形式,最左边是符号位,0为正,1为负。
利用原码对正数进行计算是不会有问题的。
原码的弊端
利用原码对负数进行计算时,结果就会出错,最终的计算结果,和我们的预期结果是相反的。
比如:
一个字节,用1和-1来计算
-
正数计算,1的原码为:0000 0001
进行+1,结果为:0000 0010
等于2,没有任何问题。
-
负数计算,-1的原码为:1000 0001
进行+1,结果为,1000 0010
等于-2,与我们预期的结果相反。
可以看见,原码对负数进行计算,会出现错误的结果。
原码为什么会有这样的弊端?
我们可以用一个数轴来理解。
原码对正数进行计算时,对正数加1,我们是往数轴的正方向行走,那么1+1=2,没有任何问题。
当我们用原码对负数进行计算时,因为原码的符号位为1,即为负数,而+1的操作,会使我们往数轴的负方向行走,1+1=2,但添上负号,就变成了-2。出现了错误答案。
为了解决这个问题,人们就发明了反码。
反码
反码:为了解决原码不能计算负数的问题而出现。
计算规则:正数的反码不变,负数的反码在原码的基础上,符号位不变,数值取反,0变1,1变0。
比如:
- -6的原码为:1000 0110
- -6的反码为:0111 1001
我们利用-6的反码进行+1计算
-
0111 1001 + 1 = 0111 1010
再将反码转换为原码:1000 0101
结果为-5,答案正确
利用反码,我们就可以解决原码不能对负数进行计算的弊端。
但是,反码也存在一个弊端
反码的弊端
为了清楚的看到反码的弊端,我制作了一个表格
-
我们利用反码对负数进行计算,当对-1进行加2操作的时候
-1加2(反码):1111 1110 + 0000 0010 =1 0000 0000
由于是一个字节,多的1我们不要
结果为:0000 0000
转换为原码:0000 0000 = 0
-1加2,不应该等于1吗?很明显,答案有出错了。
这是因为,反码中存在两个0。
一个正数0,编码为:0000 0000
一个负数0,编码为:1000 0000
为了解决这个问题,人们发明了补码
补码
同样,我制作了一个表格
对于正数,原码,反码,补码,都是一样的。
对于负数:
-
反码:符号位不变,其它按位取反,0变1,1变0。
-
补码:在反码的基础上,进行+1操作。
体现在表格中,就是整体向下移动了一位。
同样,我们利用补码对-1进行加2操作
-
-1的补码:1111 1111
-1加2:1111 1111 + 0000 0010 = 1 0000 0001
由于一个字节的限定,去掉左边的1,编码位:0000 0001 = 1
这时,就不会出现反码的弊端了。
可以说,补码完美解决了原码和反码的弊端,可以对正数和负数进行计算。
所以,在计算机中数字的存储还有运算,都是以补码的形式来进行的。
补码的细节
由图可见,-128没有原码和反码,但是有补码:1000 0000
有人可能疑惑,最左边位符号位,1000 0000应该是0才对。
是的,由于补码的特殊性,节省出来了一个编码。
所以在计算机中,人们将补码:1000 0000规定为-128.
一个字节的取值范围
因为补码的特殊性,节省出来一个编码,所以原码范围:-127~127,就可以增加一位。
则,一个字节的取值范围为:-128~127
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!