黑马程序员技术交流社区
标题:
小数的存储形式的反码与补码
[打印本页]
作者:
夏蝉
时间:
2018-3-25 13:56
标题:
小数的存储形式的反码与补码
这个技术贴主要是普及两个计算机基础针对0基础同学,大神靠边;
先来说说小数
小数在计算机中称为浮点数,那么浮点数是怎么存储的呢
前辈们早就想到了用科学计数法的形式来表示,
即用一个尾数,一个基数,一个指数,以及一个表示正负的符号,来表达实数
将浮点数特定长度的连续字节的二进制位分成3个区域,二进制中基数是二
比如十进制数中值0.123*10^2中10就是基数,所以3个区域分别存储的是
符号位 阶码 尾数 长度
float 1 8 23 32
double 1 11 52 64
我们以float6.4数为例看看它的转换过程
首先将他转换成2进制数是6的二进制是110
0.4的二进制是将他乘以2然后顺序去整数位
比如
0.4*2=0.8 取0;
0.8*2=1.6 取1;
0.6*2=1.2 去1;
0.2*2=0.4 取1;
0.4*2=0.8 取0;
一直乘到小数位是零为止,但是有的数是乘不尽的,那就取到能取到的最大长度为止
所以是110.01100110011001100110;
这个数也可以表示为1.1001100110011001100110*2^2;
由于我们规定了这个整数位必须是1所以存储的时候省略这个1;这样可以提升一位精度
变成.10011001100110011001100;最后我补了一个0,但是这个0不是随便补的
而是之前乘出来是0就补0;
好的那尾数我们就求好了10011001100110011001100;
再来看阶数再来看阶数,这里是2^2次方,指数就是2。
因为在float中阶码是占8位,而阶码又是有符号的因为又负几次方的存在,表示
浮点的右移;这里规定了float类型的偏置量是127加上这个数左移两位,所以这个数
偏置量为129;他就是用来表示浮点的移动的,然后求出129的2进制数为 1000 0001
将他们拼接起来就是 1000 0001 10011001100110011001100,最后加上符号位0;
就是 01000 0001 10011001100110011001100;然后我们从后往前4个分开
0100 0000 1100 1100 1100 1100 1100 1100求出16进制数,
4 0 C C C C C C
最后的Ox40CCCCCC 这就是计算机存储6.4这个数的形式
有兴趣的还可以逆向算回去看看会发生什么变化
第二个是反码与补码:
大家都知道,计算机计算的时候用的都是2进制数,那么有没有真实的去计算过过,看会遇到什么问题,比如 1+ -1 ,用byte数举例,首位表示符号0为正1为负
1 的原码就是 0000 0001;
-1 的原码就是 1000 0001;
它俩合在一起就变成了 1000 0010; 而这个数是表示-2的,但-1+1应该等于0;在之前计算机就得先比较两个数的绝对值,由绝对值大的数决定符号
但是这样,对计算机来说很麻烦,
还有就是这两个数 0000 0000;
1000 0000;
它俩表示的都是0,一个 +0 一个 -0;
于是乎伟大的前辈们就发明了反码;
正数的反码就是原码,而负数的反码是符号为不变,数值位全部取反,
举个例子: +1的反码为 0000 0001
-1的反码为 1111 1110
他们相加就是 1111 1111;这个数就被定义为-0;这样就解决了加减的问题
当是伟大的前辈们还是不满足,因为只应该有一个零.
于是就发明了补码
正数的补码还是原码,依然是对负数下手,负数的补码为原码除符号位全部取反再让最低位加一
举例: +7的补码为 0000 0111
-7的补码为 1111 1001
如果加一下是 1 0000 0000;对吧 但是byte数只能存8位;所以最前面的1刚好被抹掉了 所以它刚好就变成了0;这样就不存在-0了
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2