机器语言——码运算(详解反补码由来)

在高中之前,数学是这样的,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=00101010  数值为+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、书看不懂,看不懂就开始编呗。等你编了差不多,然后回头再去看,突然感觉,似乎编的还挺对……

在写这篇博客之前,我根本就不知道反码补码 是干什么用的,只知道如何得到反码补码。在写的过程中,反复思考。反码补码有什么用处?为什么要引入?搞不明白……那先写着……然后就都写出来了。

如果文章中有错误之处,望斧正。

时间: 2024-08-28 14:42:25

机器语言——码运算(详解反补码由来)的相关文章

实例详解:反编译Android APK,修改字节码后再回编译成APK

本文详细介绍了如何反编译一个未被混淆过的Android APK,修改smali字节码后,再回编译成APK并更新签名,使之可正常安装.破译后的apk无论输入什么样的用户名和密码都可以成功进入到第二个Activity. 有时难免要反编译一个APK,修改其中的若干关键判断点,然后再回编译成一个全新的可用的apk,这完全是可实现的.若要完成上述工作,需要以下工具,杂家后面会把下载链接也附上.这些软件截止本文发布时,经过杂家确认都是最新的版本. 1.APK-Multi-Toolv1.0.11.zip 用它

实现高性能纠删码引擎 | 纠删码技术详解(下)

作者介绍: 徐祥曦,七牛云工程师,独立开发了多套高性能纠删码/再生码编码引擎.柳青,华中科技大学博士,研究方向为基于纠删码的分布式存储系统. 前言: 在上篇<如何选择纠删码编码引擎>中,我们简单了解了 Reed-Solomon Codes(RS 码)的编/解码过程,以及编码引擎的评判标准.但并没有就具体实现进行展开,本篇作为<纠删码技术详解>的下篇,我们将主要探讨工程实现的问题. 这里先简单提炼一下实现高性能纠删码引擎的要点:首先,根据编码理论将矩阵以及有限域的运算工程化,接下来主

如何生成二维码过程详解

如何生成二维码过程详解 1 下载zxing2.1 2 本代码配置环境:eclipse.java1.6.windows8.zxing2.1 3 解压后将文件夹里面core/src下面的com文件夹导入到eclipse工程(工程可以自己建,如QrCode)中,图示如下: 注意:在源码中需要修改其编码配置为UTF-8,否则后面解码后面的文件中中文会乱码,修改图示如下: 4 TestEnDeCode.java源代码 1 package test; 2 import java.awt.image.Buff

NopCommerce源码架构详解--初识高性能的开源商城系统cms

很多人都说通过阅读.学习大神们高质量的代码是提高自己技术能力最快的方式之一.我觉得通过阅读NopCommerce的源码,可以从中学习很多企业系统.软件开发的规范和一些新的技术.技巧,可以快速地提高我们的技术能力.所以我最近决定写一个“NopCommerce源码架构详解”的系列,来详细剖析NopCommerce的架构和原理. Nopcommerce主要用到的技术及特点: 1.Entity Framework 2.ASP.NET mvc 3.IoC容器+依赖注入(Autofac) 4.使用EF中的E

NopCommerce源码架构详解

NopCommerce源码架构详解--初识高性能的开源商城系统cms 很多人都说通过阅读.学习大神们高质量的代码是提高自己技术能力最快的方式之一.我觉得通过阅读NopCommerce的源码,可以从中学习很多企业系统.软件开发的规范和一些新的技术.技巧,可以快速地提高我们的技术能力.所以我最近决定写一个“NopCommerce源码架构详解”的系列,来详细剖析NopCommerce的架构和原理. Nopcommerce主要用到的技术及特点: 1.Entity Framework 2.ASP.NET 

Nop--NopCommerce源码架构详解专题目录

最近在研究外国优秀的ASP.NET mvc电子商务网站系统NopCommerce源码架构.这个系统无论是代码组织结构.思想及分层都值得我们学习.对于没有一定开发经验的人要完全搞懂这个源码还是有一定的难度的,所以也打算写一个跟蓝狐学习Nop--NopCommerce源码架构详解系列文章. 以下文章主要针对NopCommerce版本:Nop3.4 NopCommerce源码架构详解--初识高性能的开源商城系统cms NopCommerce源码架构详解--Autofac依赖注入分析 NopCommer

Hadoop3.1.1源码Client详解 : Packet入队后消息系统运作之DataStreamer(Packet发送) : 主干

该系列总览: Hadoop3.1.1架构体系——设计原理阐述与Client源码图文详解 : 总览 在上一章(Hadoop3.1.1源码Client详解 : 写入准备-RPC调用与流的建立) 我们提到,在输出流DFSOutputStream创建后,DataStreamer也随之创建,并且被启动 下文主要是围绕DataStreamer进行讲解 DataStreamer是一个守护线程类,继承关系如下.       观察DataStreamer的run方法,没有意外的,我们可以发现他和普通的做法一样,用

-=,+=混合运算详解

+=与-=运算符混合计算解析: int x = 3; x += x -= x -= x += x -= x; 详解:算数运算按运算符优先级运算,从右至左计算. 1. x=x-x; 实际为 3 - 3 计算结果为0: 2. x=x+x; 实际为 3 - 0,0是第1步结果,计算结果为3: 3. x=x-x; 实际为 3 - 3,3是第2步结果,计算结果为0: 4. x=x-x; 实际为 3 - 0,0是第3步结果,计算结果为3: 5. x=x+x; 实际为 3 + 3,3是第4步结果,计算结果为6

机器语言——码运算(具体解释反码补码由来)

在高中之前,数学是这种.1+1=2 .这些都是死的. 上了大学之后.这个世界是这种-- 机器语言最低级的语言,仅仅有两个标志 0和1.通过这两个标志来实现计算. 曾经我们所做的数学运算都是在10进制上面进行的.而计算机仅仅能用二进制的数来进行运算. 大家都知道9用机器语言为 1001(进制的转换不做具体介绍) 再转换之前.这个数但是有要求的.这个数必须是正整数.才干够进行转换. 假设这个数为 -9.那么这个数怎样用机器语言来表示呢. 假设是小数.又是怎样表示的. 原码: +9和-9,不就是相差一