zoukankan      html  css  js  c++  java
  • 机器语言——码运算(具体解释反码补码由来)

    在高中之前,数学是这种。1+1=2 .这些都是死的。

    上了大学之后。这个世界是这种……

    机器语言最低级的语言,仅仅有两个标志 0和1.通过这两个标志来实现计算。

    曾经我们所做的数学运算都是在10进制上面进行的。而计算机仅仅能用二进制的数来进行运算。

     

    大家都知道9用机器语言为 1001(进制的转换不做具体介绍)

    再转换之前。这个数但是有要求的。这个数必须是正整数。才干够进行转换。

    假设这个数为 -9。那么这个数怎样用机器语言来表示呢。

    假设是小数。又是怎样表示的。

     

    原码:

    +9和-9,不就是相差一个符号么,多给一个位。进行标志不就能够了嘛。

    +9表示为 0000 1001

    -9表示为 0001 1001

    利用二进制的数来处理 我们已知的问题,无非就是编码,制定规则而已。

    然后,人们就把这样的加上符号位的表示方法 称为  原码。

     

    计算机中,能够直接计算的运算。仅仅有一个加法。

    比方:9+11=20

    1001+1011=1 0100 

    假设。在进行运算的时候使用原码进行运算

    即:0000 1001+0000 1011=01 0100

     

    这个运算是正整数之间的加法,假设在进行运算的数之间,有小数,或者 负数。

    那应该怎样处理呢?

    注:以下中的码。带下划线的为符号位。

     

    反码:

    人们都知道。包括负数的加法。实际上就是所谓的减法。所以要处理的就是,怎样把负数增加到刚才的加法运算中。

    9-3=6   改写成9+(-3)=6

    使用原码表示进行运算:0000 1001 +0001 0011=11100=-12

     

    这个结果,显然就不对了吧。

    那这个问题又是怎样产生的?这个问题,是因为把原码中的符号位进行了计算,导致结果不对的。

     

    既然结果不对,那么就编呗。反正找到一个能计算正确的规则。起个名字不就得了。

    首先。要想正确。须要把符号位 也能够进行计算。

    首先,两个数进行运算的时候.符号位后面的字符串,代表的才是真实数值的绝对值。

     

    补码引例

        在说补码之前。先举一个样例。

        在现实生活中。某一个时刻。你看钟表的时候是9点。

    之后,你活动了9个小时。如今是几点?

     

       先说正常人是怎么算的。正常人肯定是:9+9-12=6  嗯,如今6点了。

       另一种算法,就是。你知道12个小时是一圈。那么过去了9个小时,则能够这么算:9-(12-9)=6  也是6点。

     

    在来看一个上面这个样例:

       +9 + (-3)

       0000 1001 + 0001 0011

     

    假设利用原码进行计算,肯定结果不对了。符号位之前的临时不考虑

    我把负数的原码 进行一下转换。转换成 1100

    之后在进行计算: 0000 1001 + 0001 1100  = 0010 0101     符号位发生了变化。

    数值应该为21.可是21>15=2^4-1 所以 影响了符号位。

    在自己算一下 -3 到 12的改变量。 所以结果为 21-15=+6

     

    在此之前。没有考虑符号位。

    不考虑符号位。将符号位之后的符号,都按位取反。0改成1。1改成0.

    这个形式的编码称为 反码。

     

    这样计算机就能够计算 二进制的减法了。

     

    补码

       在上述的减法运算中,尽管能够得到运算的结果。可是亲们发现了没。

    数值6根本就没有在结果中显示出来。

       所以为了解决上述问题。

    由-3 转换成 +12的 过程中,数值改变了15. 可是。15这个数值 效果,不能等价于 时钟运算中的 12小时。

    所以要将反码进行+1之后再进行计算。

       即 -3的补码=反码+1=0001 1100 +1=0001 1101

     

       之后的运算:0000 1001+0001 1101=00100110  数值为+6

       符号位,发生变化 偶数 仍为正数。

     

       如今懂了什么叫补码了吧。

    补码,你还记得什么叫补角吗?这个跟那个意思一样,就是凑一块就圆满了。

    补码就是 在原码的基础上,找到那个  与他正好互补,以便形成一个符号位的数。

    最简单的获取方式:原码-〉反码  然后+1

     

    浮点数

       在计算机的运算中,也要处理小数的运算。

    即所谓的浮点数。

       上次某同学问我。这个题怎么 0.1+0.1=1啊 。这明显就是一个坑啊。

    利用人们已经形成的十进制思想。导致想不通。

       在学习这个问题之前,首先要说一下。在10进制的小数中。是怎么定义的。

    0.1 0.01 分别代表什么。

       十进制中,每一个位置所代表的权重都是不同的。

       比方100 中的 1。所代表的就是 10^2

       那么,0.01中的1代表的是什么? 非常显然  这个小数里面的1 所代表的是 10^-2

     

    相同的。十进制的数值每一个位置都有自己的权重。那么在2进制的数值中。

    每一个数也都有自己的权重。

    0.1 非常明显就是 2^-1 了。 那么0.1+0.1 …… 你的世界观还没被毁……

     

    至于浮点数的运算,我就不啰嗦了。浮点数的运算。在计算机中,也就是加了点限制。事实上,全是自己通过0和1 进行 编码。说白了,就是瞎编,制造规则。然后行的通。就用。

     

    总结:

    1、看书看到公式。别头大。也许做几道题,全都会了,那些公式。

    呵呵……

    2、没有绝对的正确。

    仅仅是那个圈子你还没有接触过而已。

    3、书看不懂。看不懂就開始编呗。等你编了差点儿相同,然后回头再去看,突然感觉。似乎编的还挺对……

     

        在写这篇博客之前,我根本就不知道反码补码 是干什么用的,仅仅知道怎样得到反码补码。

    在写的过程中,重复思考。

    反码补码有什么用处?为什么要引入?搞不明确……那先写着……然后就都写出来了

    假设文章中有错误之处,望斧正。

     

  • 相关阅读:
    LeetCode偶尔一题 —— 617. 合并二叉树
    《剑指offer》 —— 链表中倒数第k个节点
    《剑指offer》 —— 青蛙跳台阶问题
    《剑指offer》—— 二维数组中的查找
    《剑指offer》—— 替换空格
    《剑指offer》—— 合并两个排序的链表
    《剑指offer》—— 礼物的最大价值
    生成Nuget 源代码包来重用你的Asp.net MVC代码
    Pro ASP.Net Core MVC 6th 第四章
    Pro ASP.NET Core MVC 6th 第三章
  • 原文地址:https://www.cnblogs.com/gcczhongduan/p/5068876.html
Copyright © 2011-2022 走看看