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.补码的作用
采用补码的方式,计算机可以将减法运算转化为加法运算。
例如:
5.浮点型数据
存储形式:
浮点型的以IEEE浮点标准进行存储:将特定长度的连续字节的所有二进制位分割为特定宽度的符号域,指数域和尾数域三个域,分别用于表示给定二进制浮点数中的符号(s),指数(E)和尾数(M)。
V=(−1)s×M×2E V = ( − 1 ) s × M × 2 E
以十进制数-123.456为例, −123.456=−1.23456×102 − 123.456 = − 1.23456 × 10 2 ,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.0100 , 1100 , 1100 , 1100 , 1100 , 11 × 2 2
规定小数点左侧只能为1,并且1可以省略。所以,末尾再添加一位(根据该位置原有的数据填写),变为.0100,1100,1100,1100,1100,110×22 .0100 , 1100 , 1100 , 1100 , 1100 , 110 × 2 2
所以5.2f的尾数为0100,1100,1100,1100,1100,110。
指数为2,阶码占8位,且有符号。根据IEEE标准,可以得出
float的偏置量Bias=2k−1−1=28−1−1=127阶码e=指数E+偏置量Bias=2+127=129 f l o a t 的 偏 置 量 B i a s = 2 k − 1 − 1 = 2 8 − 1 − 1 = 127 阶 码 e = 指 数 E + 偏 置 量 B i a s = 2 + 127 = 129
所以5.2f的阶码为129=1000,0001
因此,5.2f在计算机中的表示形式为0 | 1000,0001 | 0100,1100,1100,1100,1100,110。
参考文档:
1.http://blog.youkuaiyun.com/jjj19891128/article/details/22938429
2.http://blog.youkuaiyun.com/jjj19891128/article/details/22945441
感谢!!!