原码补码反码
第一次接触源码补码反码的时候是大一的计算机算法导论。
后来在数电接触过一次,在学网络原理的时候,关于子网掩码的计算又接触过。
一直没把关系屡清楚...
马上就要组原考试了,今天怎么着做个了断对吧。
1.序言(由之前的基础的话,跳过去看第二节)
万事万物肯定是来源是生活的
首先计算机参与运算的数有两大类, 有符号数和无符号数。他们都放在了寄存器之中。通常我们也称为寄存器的位数是机器字长。
这里注意。机器字长也是决定计算机硬件的主要技术指标。决定计算机性能的这个问题,我们之后再谈。
那啥是机器字长啊, 举个例子吧那就
cpu的寄存器要运算器东西,肯定有个限度吧。
他要是做运算的时候,给他发过来一个八位的代码,他机器字长正好是八位的。就可以处理。
那人家要是传一个十六位的代码,岂不是就GG了。 他只能处理八位的,那就只能让人家发两遍,第一次运行前八位的,第二次再把剩下的八位没运算的算完。
用脚指头想都知道,这算两次,在其他条件的情况下。 时间可就是double了啊。
好,我们大概知道机器字长的概念了,继续。
万事万物都来源与生活。
如果生活只有正数的话....岂不是如果有赊欠、损失、消费、开支等等这些就太麻烦了
(所有数学家是真牛逼,一个负号就解决了)
负号大家用着很方便,但是计算机他去哪里知道什么是负数去啊....
所以这就有了有符号数这么一说,有符号数的第一位就作为判断这个数正负而空出来。其他的位数用来存储数据。
那么无符号数顾名思义,就是在计算机在进行存储运算的时候,所有的位数都用来进行储存数字了,毫无正负可言。
那么如果一个16位机器字长的寄存器为例子。
如果存储的是无符号数,那么可以表示的范围是 0~65535 (2的16次方-1)
但是存储的是有符号数,那么可以表示的范围是 -32768~32767(2 的15次方-1) ()
计算机就是个会处理01的机器,别说是正负号了,你拿+ - 都白搭啊
那你既然知道0 和1 是啥 那咱们就规定一下吧 0就代表正数,1代表负数。
大概就是这个样子了
前两行是小数点的有符号数表示
后两行是整数的有符号数表示。
2.原码补码反码计算方法。
需要速查的可以看这里。
那么 (+)(-)1 这个数字如何在机器字长为8位的寄存器中,分别用原码、反码、补码来表示呢
2.1原码: 难度系数★☆☆☆☆
数字±1的原码是(注意逗号)
[+1]原 = 0,000 0001
[-1]原 = 1,000 0001
数字±0,1的原码(注意小数点)
[+0.1]原 = 0.100 0000
[-0.1]原 = 1.100 000
我们看到第一位的数值被占用, 用0或者1 作为判断正负的标志。
那么笔者再举几个例子吧。
+1010111
-1011011
+110
-10011
那么这些的原码分别是什么呢
1,1010111
0,1011011
1,110
0,10011
再多的例子我也举不出来了,咱们之间可以上公式嘛。
x是真值,n是位数。想深究的同学可以自己带进去看看,不过不建议记公式,理解就好了。
2.2反码 难度系数★★☆☆☆
我们先看一下公式吧。
emmmm 这个公式我要是套进去算一算的话,我也得搞一会。
简单的说,
正数的反码是他原码
负数的反码是在其原码的基础上, 除了符号位数不变,其余位取反.
平常反码也就是用原码求反码过程的过渡。
那咱们举个例子来看看吧。
来,来几个数字!
+11001010
+11010101
+11111001
他们如果求反码的话,把整数摘掉就好了 前面加个0,即可。
那么如果是负数呢?
来,上几个数字!
-1001
-1101
-1001
先把他们搞成原码,相信同学大家都会了对吧~
1,1001
1,1101
1,1001
(以后原码补码反码出现正负号就乱棍打死丫的。计算机不认识正负号!!!)
符号位不变,其他值取反。
1,0110
1,0010
1,0110
嗯嗯就是这样就是这样了。
2.2补码 难度系数★★★☆☆
好了好了,来来来补码let's go
补码这个东西是吧。
上公式先,
好的,我知道反正你不想看。
那我就简单来说吧:
正数的补码就是其本身
负数的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后+1. (即在反码的基础上+1)
x=+1001
[x]反=0,1001
[x]补= 0,1001 (我再说一遍,谁要是在原码补码反码上写正负号 就乱棍打死丫的。 计算机不认识正负!!!)
x=-1001
[x]原码=1,1001
[x]反码=1,0110
[x]补码=1,0111