在计算机中,大多数数据以二进制(0,1)形式存储,但是当我们进行具体的运算时计算及内部到底是怎么工作的呢?
其实计算机并不会直接将我们所输入的数据进行直接计算,而是要经过一系列转换之后才可得到我们所看到的结果,而这些转换离不开原码,反码,补码,以及移码;
我们知道在计算机中一个字节占八个比特位;以二进制进行存储每个位置都有两种可能;计算机每次读取固定的字长八位;其中 原码:最高位是符号位,其余低位表示数值的绝对值;
这里所谓的符号位(也就是我们数学中的正负号)我们用0表示正数,用1表示负数;
举个栗子:
1的原码:0000 0001(第一个0表示符号位);
-1的原码:1000 0001(第一个1表示符号位);
再上面的8位中,每一位都有0或1这两种情况,那么我们就可以推出原码表示的的定点整数范围:
-(-1)~ +(-1)
假设计算机每次读取三位字长,每一位上都有0,1两种可能,那么我们可得到8种不同的表示结果,
000=0 | 100=-0 |
001=1 | 101=-1 |
010=2 | 110=-2 |
011=3 | 111=-3 |
(其中最高位是符号位,转化成对应的十进制得到等号左侧数据)
不难发现所表示的数据范围是-3~+3;怎样用公式表示呢?
因为最高位为符号位所以后两位表示具体的数值,“11”——>+,怎样用一个位权来表示呢?
我们可以给“11”加上“1”于是得到“100”——>,因为转换的过程中多加了1,所以在公式的后面要减去1,而幂指数恰好和位数相差1;所以得到
原码表示的的定点整数范围:(反码原理和原码原理相同,不做赘述)
-(-1)~ +(-1)
在上表中我们会发现出现了两次0,(“+0”和“-0”),在原码和补码中为了避免重复我们一般将“-0”除去只保留“+0”,所以
原码表示的数码个数为: (反码原理和原码原理相同,不做赘述)
同理我们可以推出原码定点小数的范围:
-(1-)~ +(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”(),所以得到
原码定点小数的范围:(反码原理和原码原理相同,不做赘述)
-(1-)~ +(1-)
在数学中,我们都知道1+(-1)和为零,但是若按照上面的表示方法来计算
1+(-1)就变成了:10000010;
转化成十进制之后得到数值:-2;“???”这显然不符合我们的正常逻辑,于是反码该出手了~
见名之意取其相反的一面,同样的一个字节八位最高位为符号位,反码:正数的反码与原码相同,负数的反码是符号位不变其绝对值位按位取反;
举个栗子:
1的反码:0000 0001(第一个0表示符号位,正数的反码与原码相同);
-1的反码:1111 1110(第一个1表示符号位,符号位不变其余位按位取反);
若按照上面的表示方法来计算
1+(-1)就变成了:11111111,求值得到数值为:-0;
显然这也不符合常理,所以补码该出手了~
同样的一个字节八位最高位为符号位,补码:正数的补码与原码相同,负数的补码是其符号位不变,在其反码的末位加1;
举个栗子:
1的补码:0000 0001(第一个0表示符号位,正数的补码与原码相同);
-1的补码:1111 1111(第一个1表示符号位,符号位不变在反码的末位加1);
那怎样表示补码的定点整数范围呢?
原理上是和原码相同的,在原码中我们发现“0”有两种表示方式“000”,“100”(假设计算机每次读取3位,8位是一个道理),而在补码中我们多了一种人为规定将“100”扩大了,也就是利用了“100”这个编码使其表示为“-”,因此
补码的定点整数范围是:-()~ +() (移码原理和原码原理相同,不做赘述)
定点小数的表示范围是:-1 ~ +(1-) (移码原理和原码原理相同,不做赘述)
原码表示的数码个数为: (移码原理和原码原理相同,不做赘述)
若按照上面的表示方法来计算
1+(-1)就变成了:00000000,求值得到数值为:+0;
到此才可得到我们想要的结果,所以在计算机中但凭原码,是不可能求出真正的数值的,还得进行码制之间的转换才可得到最终结果;
移码:补码的符号位按位取反(正数和负数都需要变化);
举个栗子:
1的移码:1000 0001;
-1的移码:0111 1111(第一个1表示符号位,符号位不变在反码的末位加1);
1+(-1)就变成了:10000000;
码制 | 定点整数 | 定点小数 | 数码个数 |
原码 | -()~+() | -()~+() | |
反码 | -(-1)~ +(-1) | -(1-)~ +(1-) | |
补码 | -()~ +() | -1~ +) | |
移码 | -()~ +() | -1 ~ +(1-) |