数据的表示与存储

来源:互联网 发布:sql创建主键语句 编辑:程序博客网 时间:2024/05/22 13:59

1. 前言

  一直打算写些什么,今天终于迈出了第一步。
  本文讨论了数据在计算机中的表现和存储形式。

2.符号数

  符号数是数值在计算机中的二进制表示形式,分为有符号数和无符号数。
  有符号数:机器字长中的最高位被称为符号位,0代表正数,1代表负数。
  无符号数:机器字长中的所有二进制位都用于表示数值,也就是不存在负数。
  在JAVA语言中,不存在无符号数。

3.整型数据的原码、反码与补码

  3.1 正整型
  对于正整数而言,它的原码、反码与补码相同。
  以占1个字节的byte型数据为例:
  2的原码/反码/补码皆为:0000,0010
   3.2 负整型
  首位的1代表负数,例如:
  2的原码为:1000,0010
  反码(符号位不变,其余位置取反):1111,1101
  补码(+1):1111,1110

4.补码的作用

  采用补码的方式,计算机可以将减法运算转化为加法运算。
  例如:

110+210=00000001+0000,0010=0000,0011=00000011=00000011=3

110+210=1111,1111+0000,0010=0000,0001=00000001=00000001=1

5.浮点型数据

  • 存储形式:

    浮点型的以IEEE浮点标准进行存储:将特定长度的连续字节的所有二进制位分割为特定宽度的符号域,指数域和尾数域三个域,分别用于表示给定二进制浮点数中的符号(s),指数(E)和尾数(M)。

    V=(1)s×M×2E

    以十进制数-123.456为例,123.456=1.23456×102,1.23456为尾数,2为指数,符号位为1。

                                 符号位      阶码     尾数   长度                   float           1         8       23     32                   double          1         11      52     64
  • 示例:以float型数据5.2f为例
         5=0101    0.2*2=0.4*2=0.8*2=0.6*2=0.2*2=0.4......            0     0      1     1    0
  • 5的二进制表示为0101;
    0.2的二进制表示(*2取余顺排):0.00110011……
    此处,0.2的二进制表示为无限循环小数,所以5.2f在计算机中无法实现精确表示。
    由于float的尾数为23位,所以5.2f的二进制表示为101.0011,0011,0011,0011,0011;用科学计数法表示为
    1.0100,1100,1100,1100,1100,11×22

    规定小数点左侧只能为1,并且1可以省略。所以,末尾再添加一位(根据该位置原有的数据填写),变为
    .0100,1100,1100,1100,1100,110×22

    所以5.2f的尾数为0100,1100,1100,1100,1100,110。
    指数为2,阶码占8位,且有符号。根据IEEE标准,可以得出
    floatBias=2k11=2811=127e=E+Bias=2+127=129

    所以5.2f的阶码为129=1000,0001
    因此,5.2f在计算机中的表示形式为0 | 1000,0001 | 0100,1100,1100,1100,1100,110。

参考文档:

   1.http://blog.csdn.net/jjj19891128/article/details/22938429
   2.http://blog.csdn.net/jjj19891128/article/details/22945441
   感谢!!!

原创粉丝点击