当前位置: 首页 > article >正文

认识原码反码补码

目录

一.何为原码反码和补码?

(1)原码

(2)反码

(3)补码

(4)总结

二.原反补之间的简单计算

(1)补码加法

(2) 补码减法

(3) 溢出问题


一.何为原码反码和补码?

(1)原码

原码:直接将数值按照正负数的形式翻译成⼆进制得到的就是原码。

  • 符号位:最高位(最左边的位)用于表示符号,0 表示正数,1 表示负数。
  • 数值部分:其余的位用于表示数值的绝对值。

例如,在 8 位二进制中:

  • +5 表示为:0000 0101(最左边的0表示正数)
  • -5 表示为:1000 0101(最右边的1表示负数)

(2)反码

反码:将原码的符号位不变,其他位依次按位取反就可以得到反码。

  • 正数:反码和原码一样。
  • 负数:反码为原码的按位取反。

例如,在 8 位二进制中:

  • +5 的反码:0000 0101(与原码相同)
  • -5 的反码:1111 1010(将原码的数值部分按位取反)

(3)补码

补码:反码+1就得到补码。

  • 正数:补码与原码相同。
  • 负数:负数的补码为反码加 1。

例如,在 8 位二进制中:

  • +5 的补码:0000 0101(与原码相同)
  • -5 的补码:1111 1011(反码 1111 1010 + 1 = 1111 1011

(4)总结

数值原码反码补码
+50000 01010000 01010000 0101
-51000 01011111 10101111 1011
+00000 00000000 00000000 0000
-01000 00001111 11110000 0000

二.原反补之间的简单计算

(1)补码加法

补码的加法与普通的二进制加法相同,不区分正负数。无论是正数加正数、正数加负数,还是负数加负数,计算机只需将它们的补码相加,溢出的位自动丢弃。

例子:

例子 1:正数加法

计算 5 + 3,用 8 位补码表示:

  • 5 的补码是:0000 0101
  • 3 的补码是:0000 0011
  0000 0101
+ 0000 0011
------------
  0000 1000   (结果为 8,正确)

例子 2:正数加负数

计算 5 + (-3),用 8 位补码表示:

  • 5 的补码是:0000 0101
  • -3 的补码是:1111 1101(原码是0000 0011)(3 的反码 1111 1100 加 1)
  0000 0101
+ 1111 1101
------------
  0000 0010   (结果为 2,正确)

溢出的位被自动丢弃,所以结果保持正确。

(2) 补码减法

减法可以通过将减数的补码取反(即变成负数),然后与被减数相加来实现。因此,减法实际上也是通过加法来处理的。

例子 3:正数减法计算 5 - 3,相当于 5 + (-3),用 8 位补码表示:

  • 5 的补码是:0000 0101
  • -3 的补码是:1111 1101
  0000 0101
+ 1111 1101
------------
  0000 0010   (结果为 2,正确)

例子 4:负数减负数

计算 -5 - (-3),相当于 -5 + 3,用 8 位补码表示:

  • -5 的补码是:1111 1011
  • 3 的补码是:0000 0011
  1111 1011
+ 0000 0011
------------
  1111 1110   (结果为 -126,正确)

看上面3个例子结果都是对的,为什么到这里结果就不是-2了呢?

这是因为正数他的原反补都是相同的,我们一般都是用补码来计算两个数的相加或相减,然后再将计算出来的结果转换为原码,最后计算出最终结果,我们前面三个例子计算出来的都是正数,原反补都一样,所以是正确的。

至于这第四个例子,负数得先转换原码,我在这里教大家一个快速计算由补码转换为原码的方法:
 

从最右边开始找,找到第一个1,然后在他的前一位加1就可以得到原码
对于本题:
 1111 1110
+      1
-------------
10000 0010(显然是-2)

补充:由于计算机中采用补码表示法进行加法运算时,可以将有符号整数的加法统一为无符号整数的加法,并且如果最高位(符号位)有进位,则忽略该进位。因此,我们可以直接进行二进制加法运算而不考虑符号位的进位。

(3) 溢出问题

在使用补码进行加减法时,可能会出现 溢出。溢出是指结果超出了可表示的范围。例如,8 位补码可以表示 -128 到 127 的数值,超过这个范围的结果会出现错误。

例子 5:溢出

计算 120 + 10,用 8 位补码表示:

  • 120 的补码是:0111 1000
  • 10 的补码是:0000 1010
  0111 1000
+ 0000 1010
------------
  1000 0010   (结果为 -126,溢出)

解释:因为 8 位补码最大能表示的数是 127,但实际结果 130 超出了范围,导致溢出并得到一个错误的结果(-126)。


http://www.kler.cn/news/307788.html

相关文章:

  • 一文快速上手-create-vue脚手架
  • 2024年CAD图纸加密软件|加密图纸软件推荐:10款高效CAD加密软件
  • 苍穹外卖Day01
  • 技嘉RTX 4070 SUPER WUKONG OC显卡评测:天命人最佳2K游戏搭档 温度仅61℃
  • UE5-俯视角色移动(蓝图)01
  • 解密AI创作:提升Prompt提示词的提问技巧
  • 学习之git的远程仓库操作的常用命令
  • C++3D迷宫
  • GO 反射
  • CNSS Recruit 2024 Web方向 题解WriteUp
  • git编译安装报错
  • 基于STM32的温度、电流、电压检测proteus仿真系统(OLED、DHT11、继电器、电机)
  • 计算机毕业设计 高校学术交流平台的设计与实现 Java实战项目 附源码+文档+视频讲解
  • 借助大模型将文档转换为视频
  • html+css+js网页设计 旅游 厦门旅游网10个页面
  • element-plus的面包屑组件el-breadcrumb
  • 使用 SuperCraft AI 设计书橱模型的指南
  • 简单代码实现视频转图片_py
  • 在Flask中实现日志记录
  • 动态ip切换频率是快点好还是慢点好
  • Mybatis批量操作
  • Java 使用 Redis
  • 并发容器(Map、List、Set)实战及其原理分析
  • 如何快速清理Docker中的停止容器?
  • HFish开源蜜罐系统常见问题排查
  • 10- 【JavaWeb】Tomcat、Servlet基础
  • springboot后端开发-常见注解及其用途
  • C++ this指针
  • 【高中数学/三角函数/判别式法】设x>0,y>0,x+2y=5,则(x+1)(2y+1)/(xy)^0.5的最小值为?
  • dedecms(四种webshell姿势)、aspcms webshell漏洞复现