码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 一图了解原码、反码、补码的演进历史


    在这里插入图片描述

    计算机,用二进制运算解决了 十进制数加减乘除的问题。

    • 我们可以将其分为 “表示层” 和 “计算层”
    • 其中计算层由 “加减法器时代” ,精简化为 “仅用加法器的时代”,也就是“原码” 进化到 “反补码” 的时代。
    • 而由于 “反码” 存在 “编码重复问题” 被抛弃,升级为 “补码”。

    演示反码的Bug

    先说明,反码的Bug 是反码本身存在 “编码重复性” 问题所导致的(即存在多个 编码对应 1个值,类似人们身份证的重名。)

    1.演示反码能正常工作的场景

    (两正和两负数的场景不展开演示了,有兴趣可以自行研究“是否受编码重复性影响?”):
    -8 + 2 = -6
    原码: 1000 1000 + 0000 0010 = 1000 0110
    反码: 1111 0111 + 0000 0010 = 1111 1001 (原码 1000 0110 -6 )
    补码: 1111 1000 + 0000 0010 = 1111 1010 (原码 1000 0110 -6 )

    2. 演示反码不能正常工作的场景

    8 - 2 = 6
    原码: 0000 1000 + 1000 0010 = 0000 0110
    反码: 0000 1000 + 1111 1101 = 0000 0101(原码 0000 0101 5 )
    补码: 0000 1000 + 1111 1110 = 0000 0110 (原码 0000 0110 6 )
    由于 溢出导致进位,而反码存在重复问题(原码的 0 可以用 0000 0000 表示,也可以用 1000 0000 表示,所以涉及到进位溢出时,会比预期值少 1)

    3.演示反码不能正常工作的临界场景

    3 - 2 = 1
    原码: 0000 0011 + 1000 0010 = 0000 0110
    反码: 0000 0011 + 1111 1101 = 0000 0000(原码 0000 0000 0 )
    补码: 0000 0011 + 1111 1110 = 0000 0001 (原码 0000 0001 1 )

    4. 演示反码碰巧能正常工作的临界场景

    这个时候虽然也发生溢出进位,但由于结果刚好是 -0,负0也是0,所以侥幸命中正确值 0 。
    2 - 2 = 0
    原码: 0000 0010 + 1000 0010 = 0000 0110
    反码: 0000 0010 + 1111 1101 = 1111 1111(原码 1000 0000 0 )
    补码: 0000 0010 + 1111 1110 = 0000 0000 (原码 0000 0000 0 )

    总结

    • 我们可以理解反码的问题是“编码重复性”引起的(即存在多个 编码对应 1个值,类似人们身份证的重名。)

    • 补码通过移动(反码+1)解决了这个问题,

    • 补码的设计思路,个人理解,类似我们写算法处理边界问题时采用“哨兵模式”。

    • 当然我觉得解决“编码重复性”问题的方法,还是有很多种的,比如 “ case by case ” 就是一种粗暴的手段。

  • 相关阅读:
    【GCN-RS】Learning Explicit User Interest Boundary for Recommendation (WWW‘22)
    Leetcode 二叉树番外篇 —— 搞定所有二叉树递归问题
    Unity技术手册 - 生命周期旋转RotationOverLifetime-速度旋转RotationBySpeed-外力ExternalForces
    详细解析张雪峰老师对计算机专业的评价“进可攻,退可守”--【职场篇】
    统计教程|PASS实现单因素二元Logistic回归分析且自变量为二分类的优势比检验的样本量估计
    基于github上go版本的LoraWAN Server安装及使用
    浅谈“智慧园区”
    Java---刷题02
    【Day04_0421】C语言选择题
    【QT+QGIS跨平台编译】之五十三:【QGIS_CORE跨平台编译】—【qgssqlstatementparser.cpp生成】
  • 原文地址:https://blog.csdn.net/u010833547/article/details/126196112
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号