【C语言基础】机器数真值、原码、反码、补码
机器数真值、原码、反码、补码
一、机器数、真值
一个数在计算机中的二进制表示形式, 叫做这个数的机器数,对应的实际数值为真值。
(最高位是符号位,1负0正)
+3 | -3 | 真值 |
---|---|---|
0000 0011 | 1000 0011 | 机器数 |
二、原码
原码就是符号位加上真值的绝对值, 即用第一位表示符号, 其余位表示值。
eg: [+1]原 = 0000 0001
[-1]原 = 1000 0001
三、反码
正数的反码是其本身,负数的反码是在其原码的基础上, 符号位不变,其余各个位取反。
eg: [+1] = [00000001]原 = [00000001]反
[-1] = [10000001]原 = [11111110]反
四、补码
正数的补码就是其本身,负数的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后+1
(就是反码+1)
eg: [+1] = [00000001]原 = [00000001]反 = [00000001]补
[-1] = [10000001]原 = [11111110]反 = [11111111]补
五、为什么要有这些🐎
对于计算机, 加减乘数已经是最基础的运算, 要设计的尽量简单. 计算机辨别"符号位"显然会让计算机的基础电路设计变得十分复杂,因此我们将符号位参与运算:
比如 1-1 = 1 + (-1) = 0 将所有减法都转化为加法。
首先用原码计算:
1 - 1 = 1 + (-1) = [00000001]原 + [10000001]原 = [10000010]原 = -2
这样出来的结果肯定不对,所以不能用原码直接计算。
然后用反码计算:
1 - 1 = 1 + (-1) = [0000 0001]原 + [1000 0001]原= [0000 0001]反 + [1111 1110]反 = [1111 1111]反 = [1000 0000]原 = -0
可以发现真值部分是正确的(-0为0),我们人理解的+0和-0是同一个数,但是在机器码中,
会有[0000 0000]原和[1000 0000]原两个编码表示0,因此补码解决的就是0的符号以及两个编码的问题:
1-1 = 1 + (-1) = [0000 0001]原 + [1000 0001]原 = [0000 0001]补 + [1111 1111]补 = [0000 0000]补=[0000 0000]原
这样用补码计算后,-0就不存在(-0转化为+0)了,那这个时候-0去哪里了呢?我们可以再次验证下:
(-1) + (-127) = [1000 0001]原 + [1111 1111]原 = [1111 1111]补 + [1000 0001]补 = [1000 0000]补 (实际上是[11000 0000],省略最高位)
可以发现[1000 0000]表示-128,这个时候的8bit据表示范围就变成了[-128,-1][0,+127],左右范围对称了。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)