原码,反码,补码理解
1.在了解原码反码补码之前,首先了解一下其他概念。
机械数:一个数在计算机中的二进制表示形式,叫做这个数的机器数。机器数是带符号的,在计算机用机器数的最高位存放符号,正数为0,负数为1。
例:+3 转换成二进制就是0000 0011, -3 二进制就是1000 0011.
机器数的真值:因为第一位是符号位,所以机器数的形式值就不等于真正的数值。
例:0000 0001的真值 = +000 0001 = +1,1000 0001的真值 = –000 0001 = –1
2.原码:原码就是符号位加上真值的绝对值,即用第一位表示符号,其余位表示值。
例:[+1]原= 0000 0001 [-1]原= 1000 0001
3.反码:正数的反码是其本身,负数的反码是在其原码的基础上,符号位不变,其余各个位取反。
例:[+1] = [0000 0001]原= [0000 0001]反 [-1] = [1000 0001]原= [1111 1110]反
4.补码:正数的补码就是其本身,负数的补码是在其原码的基础上,符号位不变,其余各位取反,最后+1。(也即在反码的基础上+1)
例:[+1] = [0000 0001]原= [0000 0001]反= [0000 0001]补 [-1] = [1000 0001]原= [1111 1110]反= [1111 1111]补
5.三种码出现的原因:原码是被人脑直接识别并用于计算表示方式,但因为人脑可以知道第一位是符号位,在计算的时候我们会根据符号位,选择对真值区域的加减。(真值的概念在本文最开头) 但是对于计算机,加减乘数已经是最基础的运算,要设计的尽量简单,计算机辨别"符号位"显然会让计算机的基础电路设计变得十分复杂,于是人们想出了将符号位也参与运算的方法。我们知道,根据运算法则减去一个正数等于加上一个负数,即:1-1 = 1 + (-1) = 0, 所以机器可以只有加法而没有减法,这样计算机运算的设计就更简单了,于是人们开始探索将符号位参与运算,并且只保留加法的方法。如果用原码表示,让符号位也参与计算,显然对于减法来说,结果是不正确的。这也就是为何计算机内部不使用原码表示一个数。发现用反码计算减法,结果的真值部分是正确的。而唯一的问题其实就出现在"0"这个特殊的数值上,虽然人们理解上+0和-0是一样的,但是0带符号是没有任何意义的,而且会有[0000 0000]原和[1000 0000]原两个编码表示0。于是补码的出现,解决了0的符号问题以及0的两个编码问题:为了解决原码做减法的问题, 出现了反码。
参考于百度
6.三种码的关键点:
(1)二进制的最高位是符号位:0表示正数,1表示负数
(2)正数的原码,反码,补码都相同
(3)负数的反码=原码符号位不变,其他位取反
(4)负数的补码=他的反码+1 负数的反码=他的补码+1
(5)0的反码,补码都是0
(6)java没有无符号数,java中的数都是有符号的
(7)在计算机运算时,都是以补码的方式运算的
(8)当我们看运算结果的时候,要看他的原码
参考于韩顺平讲java
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性