热门标签 | HotTags
当前位置:  开发笔记 > 程序员 > 正文

学习笔记:原码,反码,补码

学习笔记:原码,反码,补码原码反码补码原理参考资料作为一个程序员,始终要坚持一个信念,那就是省屁吹灯,这也是一切的源头。C

学习笔记:原码, 反码, 补码

  • 原码
  • 反码
  • 补码
  • 原理
  • 参考资料



作为一个程序员,始终要坚持一个信念,那就是
省屁吹灯,这也是一切的源头。
  1. CPU做加法运算最快。
  2. 尽量将减法运算转换成加法进行计算。
  3. 二进制表示数值时,最高是符号位,如果计算时要先判断符号再算,就复杂了。思路,让符号一起参与计算(像正常的加法一样)

原码
  1. 8位二进制来表示一个数字为例。最左边的第1位作为符号位,还剩下后7位可以用来表示
    1.1. 正数符号位为:0:如: 1 的二进制为 00000001
    1.2. 负数符号位为:1:如:-1 的二进制为 10000001
  2. 正数原码 = 反码 = 补码。所以我们在讨论反码, 补码时主要是说负数
  3. 之所以发明出反码, 补码就是为了让负数的二进制运算,和正数保持相同的运算规则(让符号位参与计算并且将减法转成加法进行),最后还能得到我们想要的正确结果。

反码
  1. 正数:强调前面已经说过了正数原码、反码、补码都一样。
  2. 负数:符号位不变,其余各个位取反
    2.1. -1 原码:1000 0001
    2.2. -1 补码:1111 1110 (放在256大环中看此值为 254补数还差1 )
  3. 使用反码如愿让符号位也参与计算了,但还有两个问题:
    3.1. 我们得到的结果比真实结果少1.
    3.2. 存一个尴尬的负0问题:1000 0000

补码
  1. 正数:再次强调前面已经说过了正数原码、反码、补码都一样。
  2. 负数:在反码基础上+1。补上了反码运算少的1,并使得正负0的补码相同,解决了-0问题。
    -0 原码:1000 0000
    -0 反码:1111 1111 (当作原码解析此值为 255 )
    -0 补码:0000 0000 等于 +0 = 0000 0000 (符号位溢出,又变回了正数)
  3. 人为定义1000 0000 为 -128,以至于我们看到的取值范围负数会比正数多一位:[-128, 127]

原理

时钟为例,当前时针指向6点,如果想将其调整为3点,可以有两个方案:

  1. 顺时针调:+96+9=3
  2. 逆时针调:-36-3=3。转为等价的加法:6+(12-3)

成功将减法-3替换为+9结果相同。因为它俩在一个12的闭环当中,互为补数。
我们的补码也是同理。 0000 00008位二进制数就是一个256的大环。(最大值为255再加1256就是下一圈的0了,就如同没有今夜的24点,只有明天的0点)

例:在256的圆环中,向后-1 等于向前 +255
(+255-1256 为模的补数 )
-1 原码:1000 0001
-1 反码:1111 1110 (放在256大环中看此值为 254离补数255还差1 )
-1 补码:1111 1111。在反码之上 +1 正好 +255

结论:减去一个数,等于加上这个数的补码。因为补码计算的便利性,所以计算机中实际存储的是补码

参考资料

张子秋的博客:原码, 反码, 补码 详解


推荐阅读
  • 深入解析进程、线程与协程的关系及差异
    本文详细探讨了进程、线程和协程这三个概念的基本定义、功能特点以及它们之间的相互关系。通过对比分析,帮助读者更好地理解这三种并行计算模型在实际应用中的选择与运用。 ... [详细]
  • Python并行处理:提升数据处理速度的方法与实践
    本文探讨了如何利用Python进行数据处理的并行化,通过介绍Numba、多进程处理以及Pandas DataFrame上的并行操作等技术,旨在帮助开发者有效提高数据处理效率。 ... [详细]
  • 高效检测与修复:安卓手机屏幕测试工具
    一款名为Display Tester的软件不仅能帮助用户检测手机屏幕的多种问题,还能尝试修复AMOLED屏幕的烧屏现象,为用户提供全面的屏幕健康管理方案。 ... [详细]
  • 本文详细介绍了如何在 Windows 7 操作系统上安装和配置 InfluxDB,这是一种专为处理时间序列数据设计的高性能数据库。 ... [详细]
  • 本文介绍了MySQL数据库的安全权限管理思想及其制度流程,涵盖从项目开发、数据库更新到日常运维等多个方面的详细流程控制,旨在通过严格的流程管理和权限控制,有效预防数据安全隐患。 ... [详细]
  • 加速(Speedup)是在多核心CPU机器上运行应用程序(相比单核心CPU机器)所能够预期的性能效益。测量加速时,是以单核心CPU机器的性能为基线。当然,你可能会认为同一个App(应用程序)在双核心C ... [详细]
  • 计算机架构基础 —— 冯·诺依曼模型
    本文探讨了计算机科学的基础——冯·诺依曼体系结构,介绍了其核心概念、发展历程及面临的挑战。内容涵盖早期计算机的发展、图灵机的概念、穿孔卡的应用、香农定理的重要性以及冯·诺依曼体系结构的具体实现与当前存在的瓶颈。 ... [详细]
  • 深入理解聚簇索引与非聚簇索引及其优化策略
    本文探讨了数据库性能优化中的关键因素——索引,特别是聚簇索引与非聚簇索引的区别及应用场景。通过实例分析,提供了如何有效利用这两种索引来提升数据库查询性能的方法。 ... [详细]
  • 本文介绍了如何使用pidstat工具来监控和分析Linux系统中进程的CPU使用率、内存消耗、磁盘I/O操作及线程的上下文切换情况。通过具体命令示例,帮助读者掌握如何有效地使用此工具进行性能调优。 ... [详细]
  • 如何高效优化系统加载进度条
    本文介绍了多种方法来优化计算机的启动和运行过程中的加载进度条,包括硬件调整、系统设置优化等,旨在提升用户体验。 ... [详细]
  • 当您感觉当前使用的微型计算机CPU性能不足,需要更换更高性能的CPU时,正确的拆卸方法至关重要。本文将详细介绍几种安全有效的微型计算机CPU拆卸方法,帮助您顺利完成升级。 ... [详细]
  • 联想笔记本NVIDIA独立显卡性能及选购指南
    本文继续深入探讨联想笔记本中的NVIDIA独立显卡性能,并提供详细的型号对比与选购建议。通过分析不同显卡的性能表现,帮助读者更好地理解如何根据自己的需求选择合适的笔记本电脑。 ... [详细]
  • 深入理解Java内存模型的核心原则
    本文详细解析了Java内存模型(JMM)的核心原则,包括原子性、可见性和有序性,并探讨了JMM如何通过特定机制保证这些特性,为开发者提供多线程编程的指导。 ... [详细]
  • 在研究Linux内核代码时,经常会遇到与‘队列’相关的术语。本文旨在全面介绍Linux系统中几种常见的队列类型及其应用,帮助读者更好地理解和使用这些机制。 ... [详细]
  • 深入理解BIO与NIO的区别及其应用
    本文详细探讨了BIO(阻塞I/O)和NIO(非阻塞I/O)之间的主要差异,包括它们的工作原理、性能特点以及应用场景,旨在帮助开发者更好地理解和选择适合的I/O模型。 ... [详细]
author-avatar
大漠孤烟直1314
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有