数据的表示——原码,反码,补码,移码

在计算机中,大多数数据以二进制(0,1)形式存储,但是当我们进行具体的运算时计算及内部到底是怎么工作的呢?

其实计算机并不会直接将我们所输入的数据进行直接计算,而是要经过一系列转换之后才可得到我们所看到的结果,而这些转换离不开原码,反码,补码,以及移码

1.什么是原码?

我们知道在计算机中一个字节占八个比特位;以二进制进行存储每个位置都有两种可能;计算机每次读取固定的字长八位;其中 原码最高位是符号位,其余低位表示数值的绝对值;

这里所谓的符号位(也就是我们数学中的正负号)我们用0表示正数,用1表示负数

举个栗子:

1的原码0000 0001(第一个0表示符号位);

-1的原码1000 0001(第一个1表示符号位);

再上面的8位中,每一位都有0或1这两种情况,那么我们就可以推出原码表示的的定点整数范围

-({2_{}}^{n-1}-1)~ +({2_{}}^{n-1}-1)

假设计算机每次读取三位字长,每一位上都有0,1两种可能,那么我们可得到8种不同的表示结果,

000=0 100=-0
001=1 101=-1
010=2 110=-2
011=3 111=-3

(其中最高位是符号位,转化成对应的十进制得到等号左侧数据)

不难发现所表示的数据范围是-3~+3;怎样用公式表示呢?

因为最高位为符号位所以后两位表示具体的数值,“11”——>{2_{}}^{0}+{2_{}}^{1},怎样用一个位权来表示呢?

我们可以给“11”加上“1”于是得到“100”——>{2_{}}^{2},因为转换的过程中多加了1,所以在公式的后面要减去1,而幂指数恰好和位数相差1;所以得到

原码表示的的定点整数范围:(反码原理和原码原理相同,不做赘述)

-({2_{}}^{n-1}-1)~ +({2_{}}^{n-1}-1)

在上表中我们会发现出现了两次0,(“+0”和“-0”),在原码和补码中为了避免重复我们一般将“-0”除去只保留“+0”,所以

原码表示的数码个数为:{2_{}}^{n}-1   (反码原理和原码原理相同,不做赘述)

同理我们可以推出原码定点小数的范围: 

-(1-{2_{}}^{-(n-1)})~ +(1-{2_{}}^{-(n-1)})

0.00 1.00
0.01 1.01
0.10 1.10
0.11 1.11

同样的“0.11”不好表示我们可以给其加上“0.01”——>“1.00”(1),怎样表示“0.11”呢?即就是用1减去“0.01”({2_{}}^{-2}),所以得到

原码定点小数的范围(反码原理和原码原理相同,不做赘述)

-(1-{2_{}}^{-(n-1)})~ +(1-{2_{}}^{-(n-1)})

在数学中,我们都知道1+(-1)和为零,但是若按照上面的表示方法来计算

1+(-1)就变成了:10000010;

转化成十进制之后得到数值:-2;“???”这显然不符合我们的正常逻辑,于是反码该出手了~

2.什么是反码?

见名之意取其相反的一面,同样的一个字节八位最高位为符号位,反码正数的反码与原码相同,负数的反码是符号位不变其绝对值位按位取反

举个栗子:

1的反码:0000 0001(第一个0表示符号位,正数的反码与原码相同);

-1的反码:1111 1110(第一个1表示符号位,符号位不变其余位按位取反);

若按照上面的表示方法来计算

1+(-1)就变成了:11111111,求值得到数值为:-0;

显然这也不符合常理,所以补码该出手了~

3.什么是补码?

同样的一个字节八位最高位为符号位,补码:正数的补码与原码相同,负数的补码是其符号位不变,在其反码的末位加1;

举个栗子:

1的补码:0000 0001(第一个0表示符号位,正数的补码与原码相同);

-1的补码:1111 1111(第一个1表示符号位,符号位不变在反码的末位加1);

那怎样表示补码的定点整数范围呢?

原理上是和原码相同的,在原码中我们发现“0”有两种表示方式“000”,“100”(假设计算机每次读取3位,8位是一个道理),而在补码中我们多了一种人为规定将“100”扩大了,也就是利用了“100”这个编码使其表示为“-{2_{}}^{2}”,因此

补码的定点整数范围是:-({2_{}}^{n-1})~ +({2_{}}^{n-1}-1) (移码原理和原码原理相同,不做赘述)

定点小数的表示范围是:-1 ~  +(1-{2_{}}^{-(n-1)}) (移码原理和原码原理相同,不做赘述)

原码表示的数码个数为:{2_{}}^{n}   (移码原理和原码原理相同,不做赘述)

若按照上面的表示方法来计算

1+(-1)就变成了:00000000,求值得到数值为:+0;

到此才可得到我们想要的结果,所以在计算机中但凭原码,是不可能求出真正的数值的,还得进行码制之间的转换才可得到最终结果;

4.什么是移码?

移码:补码的符号位按位取反(正数和负数都需要变化);

举个栗子:

1的移码:1000 0001;

-1的移码:0111 1111(第一个1表示符号位,符号位不变在反码的末位加1);

1+(-1)就变成了:10000000;

5.总结图表

码制 定点整数 定点小数 数码个数
原码 -({2_{}}^{(n-1)}-1)~+({2_{}}^{n-1}-1 -(1-{2_{}}^{-(n-1)})~+(1-{2_{}}^{-(n-1)} {2_{}}^{n}-1
反码 -({2_{}}^{n-1}-1)~ +({2_{}}^{n-1}-1) -(1-{2_{}}^{-(n-1)})~ +(1-{2_{}}^{-(n-1)}) {2_{}}^{n}-1 
补码 -({2_{}}^{n-1})~ +({2_{}}^{(n-1)}-1) -1~ +(1-{2_{}}^{-(n-1)} {2_{}}^{n}
移码 -({2_{}}^{n-1})~ +({2_{}}^{n-1}-1)  -1 ~  +(1-{2_{}}^{-(n-1)} {2_{}}^{n}

你可能感兴趣的:(计算机原理,开发语言,软件工程,笔记)