一文搞懂 原码 反码 补码 有符号数 无符号数

计算机中所有的数字都是以补码的形式表示!!!(原码和反码都只是理论概念)
记住这句话对于理解 原码 反码 补码 有着巨大作用。

基础理论1:计算机表示有符号数的规则

每个字节的最高位(最左边一位)表示正负:0表示正数,1表示负数。

引出问题1:负数该如何被正确地表示

由于计算机只有累加寄存器,所以只有加法运行规则。
按照基础理论1:一个字节的
+1 应该用 0000 0001表示
-1 应该用 1000 0001表示
两者相加得:1000 0010 机器读作:-2。显然不对。所以负数的表示方法是不是有问题,该如何正确表达负数?

解决方法1:补码

首先不要去关注补码是什么,我们先来推演一下如何获得补码的规则:
按照基础理论1:
0 应该用0000 0000 来表示。
+1 比0大1 所以用 0000 0001来表示。
-1 比0小1 但是八位数都是0 所以从最高位(最左边)的左边借一位数将 0000 0000 看作 1 0000 0000 减去1 得到:1111 1111。
同理 -2 用 1111 1110表示。
此时 +1 加上 -2 的结果为:1111 1111 机器读作:-1。由此问题1 得到解决。我们把这种解决方法称作补码。
补码就此诞生:
正数表示规则符合我们对于数的大小基本认识,所以规定正数的补码就是其本身。
负数的表示规则比较反常,我们把得到负数表示规则的过程叫做求补过程。

引出问题2:求补过程该如何计算

既然找到了负数的正确表示方法,那同符号相减如何变换成相加?

解决办法2:求补运算

经过各种将 正数转化为其相反数 的运算尝试,科学家发现了机器求得正数相反数最快的方法:取反 + 加一。只需两个步骤即可求得一个数的相反数 即 求补。
例子:
+3 表示为:0000 0011.
取反:1111 1100
加一:1111 1101 。此时机器读作:-3。结果无误。
但是大家会问:取反能理解,为什么要加一。
加一的原因:
因为0 占了正数一个位置:一个字节八位:共表示256个数字,0既不是正数也不是负数,但是按照 基础理论1的规则 却占据了正数一个位置,所以负数比正数多了一位。

重新梳理思路

看到这里,我们就明白了 补码的来龙去脉,所以我们重新梳理一下逻辑:
按照 计算机表示正负数的规则 表示有符号数的方式 叫做 原码
由于计算机只有累加运算器,所以只能做加法,引出了两个问题:

  1. 如何进行异符号数 相加? 针对该问题提出补码的解决方案。
  2. 同符号数如何相减? 针对该问题提出 求补运算方法。在求补运算中取反后的表示方法叫做反码

总结规则

  1. 由于求补运算极快,所以计算机中所有数字都是以补码的形式存在。
  2. 正数表示符合常识,所以正数的反码和补码都和原码 一样。

无符号数表示规则:

最高位不再表示正负,正常计算即可。

ps:欢迎大家指正!

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值