A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

夏蝉

初级黑马

  • 黑马币:

  • 帖子:

  • 精华:

© 夏蝉 初级黑马   /  2018-3-25 13:56  /  856 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

这个技术贴主要是普及两个计算机基础针对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了

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马