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

原创 2014年09月28日 15:55:12

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

 

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

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

 

版权声明:本文为博主原创文章,未经博主允许不得转载。

[科普]原码,反码,补码由来

在计算机内部,所有信息都是用二进制数串的形式表示的整数。是整数就有正负之分,而这个正负也需要用二进制来表示,所以一般会用最高有效位作为符号位,0表示正号、1表示负号。这种正负号数字化的机内表示形式就称...
  • tiwerbao
  • tiwerbao
  • 2015年03月01日 00:51
  • 1308

补码的本质

转载自:http://blog.csdn.net/keyinglee/article/details/8298680 RT 这篇文章的由来还有一个背景故事。希望大家能慢慢读完,或许你能有所感悟...
  • u012410612
  • u012410612
  • 2013年10月16日 09:45
  • 1077

c语言原码,补码,反码你们不在意的由来

======================1.预备知识。================== 注意:此处的'=='是相等的意思。'='是赋值的意思。 在机器世界里: 正数的最高位是符号位0,负数的最...
  • yangzhen19900701
  • yangzhen19900701
  • 2013年08月03日 12:17
  • 1182

补码和unsigned

补码的由来:考虑任意一个负数,比如-24,如何表示呢?不失一般性的,假设我们用一个字节来表示这个负数。我们知道24和0的二进制表示分别是:0001 1000 0000 0000。根据以下两式: ...
  • xiaoc024
  • xiaoc024
  • 2016年06月04日 14:34
  • 567

详解原码、反码、补码——深入理解补码

学过计算机原理的人都知道原码、反码、补码,但是有多少人知道为什么会有这三种码呢,这三种码又是用来干嘛的呢。   众所周知,在计算机的世界只有01,那么显然所有的数都得转成二进制,这样计算机才能够理解...
  • hqshaozhu
  • hqshaozhu
  • 2015年09月29日 12:22
  • 4116

原码,补码,反码与位运算

原码,补码与反码 例子:-13,二进制为-1101,使用一个字节表示 原码:10001101 补码:11110011 反码:11110010 原码转反码: 正数的反码与原码相同,如13的原...
  • zhangwei1120112119
  • zhangwei1120112119
  • 2014年01月27日 22:13
  • 2359

有符号类型的最小负数的补码的由来

一、 16位的有符号整数(int) 在计算机中是用补码存储数据 为什么不用原码存 就是因为原码表示不了最小值-32768 如果是原码表示的话,编码中+0是用16个0表示,-0是用1后跟15个0表示 但...
  • nodeathphoenix
  • nodeathphoenix
  • 2010年09月14日 13:28
  • 3379

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

在高中之前,数学是这样的,1+1=2 .这些都是死的。 上了大学之后,这个世界是这样的…… 机器语言最低级的语言,只有两个标志 0和1.通过这两个标志来实现计算。 以前我们所做的数学运算都是在10进制...
  • zc474235918
  • zc474235918
  • 2014年09月28日 15:55
  • 2334

原码、反码、补码之加减运算

处理器对两个操作数进行运算时,按照无符号数求得结果,并相应设置进位标识C;同时,根据是否超出符号数的范围设置语出标识V。也就是说,如果将参加运算的操作数认为是无符号数,就应该关心进位;如果认为是有符号...
  • u014228375
  • u014228375
  • 2015年11月01日 09:53
  • 9047

原码反码补码和python中的按位运算易混点

一个有符号定点数的最高位为符号位,0是正,1是副。 以8位整数为例,原码就是这个数本身的二进制形式。 例如 00000001 就是+1 10000001 就是-...
  • cherryC2015
  • cherryC2015
  • 2017年03月02日 20:57
  • 824
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:机器语言——码运算(详解反码补码由来)
举报原因:
原因补充:

(最多只允许输入30个字)