1.整型
在一台典型的32位机器上一个有符号的int型的取值范围为-2147483648 ~ 2147483647(-2^31 ~ (2^31-1))。也就是说,在一个4字节(32位2进制),除去首位用于符号位表示正负外,其余的31位都是数字的有效位。
2.单精度浮点相关介绍
- float是单精度浮点型数据,所占字节数为4位,也就是32个比特。
- float占用4个字节和int是一样,也就是32bit。
- 第1个bit表示符号,0表示正数,1表示负数。
- 第2-9个bit表示指数,一共8位为(可以表示0-255),这里的底数是2,为了同时表示正数和负数,这里要减去127的偏移量。这样的话范围就是(-127到128),另外全0和全1作为特殊处理,所以直接表示-126到127。
- 剩下的23位表示小数部分,这里23位表示了24位的数字,因为有一个默认的前导1(只有二进制才有这个特性)。
最后结果是:(-1)^(sign) * 1.f * 2^(exponent)最大值是:2^128-1这里:sign是符号位,f是23bit的小数部分,exponent是指数部分,最后表示范围是(因为正负数是对称的,这里只关心正数。)2^(-126) ~~ 2(1-2^(-24)) * 2^127这个还不是float的取值范围,因为标准中还规定了非规格化表示法,另外还有一些特殊规定。
V=(-1)^s * M * 2^E (公式1)
(1)(-1)^s表示符号位,当s=0,V为正数;当s=1,V为负数。
(2)M表示有效数字,大于等于1,小于2。
(3)2^E表示指数位。
对于32位的float,s占1位,E占8位,M占32位,
说明:
(1)E不全为0或不全为1。这时,浮点数就采用上面的规则表示,即指数E的计算值减去127(32位)(或1023(64位)),得到真实值,再将有效数字M前加上第一位的1。
(2)E全为0。这时,浮点数的指数E等于1-127(或者1-1023),有效数字M不再加上第一位的1,而是还原为0.xxxxxx的小数。这样做是为了表示±0,以及接近于0的很小的数字。(这是因为在计算机内部保存M时,默认这个数的第一位总是1,因此可以被舍去,只保存后面的xxxxxx部分。比如保存1.01的时候,只保存01,等到读取的时候,再把第一位的1加上去。这样做的目的,是节省1位有效数字。以32位浮点数为例,留给M只有23位,将第一位的1舍去以后,等于可以保存24位有效数字。)
(3)E全为1。这时,如果有效数字M全为0,表示±无穷大(正负取决于符号位s);如果有效数字M不全为0,表示这个数不是一个数(NaN)。
int
a =
3490593
;
float
b = (
float
)a;
那么在内存中a和b究竟存放的是什么值呢?
将a展开为二进制,其值为0000 0000 0011 0101 0100 0011 0010 0001,其十六进制即为0x00354321。因为要转化为float型,所以首先要对上述二进制的表示形式改变为 M * 2^E 的形式。由于该数明显大于1,所以按照IEEE的标准,其浮点形势必然为规格化值。
因此 ,转化后的形式为:
a = 1.101010100001100100001 * 2^21
根据规格化值的定义M = 1 + f。所以f = 0.101010100001100100001。
因为float型变量的小数域一共23位。
所以b的最后23位可以得出,其值为101 0101 0000 1100 1000 0100。
下面再演绎指数域的值:因为a的指数表示法中,指数E = 21。根据公式,e = E + (2^7 -1) = 148.所以可以得出b的指数域的二进制表示为:10010100。在加上原数为正,所以符号位s=0。
所以,可以得出b的二进制表示为0 10010100 10101010000110010000100。转化为十六位进制则是0x4A550C84。换句话说,它存储在内存中的值是与a是完全不同的。但是其间还是有关联性的——a的首位为1的数值位后的二进制表示是与b的小数域完全相同的。
结论:
float从左到右,第一位是符号位,2-9位共8位表示整数位,2的8-1次方等于128,后面23位是表示小数的,所以最大值是2^128-1。
double从左到右,第一位是符号位,2-12是共11位表示整数位,2的11-1次方等于1024。剩余20位表示小数,所以最大值是2^1024-1。
可以看出浮点数的取值范围是:2^(-149)~~(2-2^(-23))*2^127,也就是也就是Float.MIN_VALUE和Float.MAX_VALUE。
3.处理方法DEMO
import java
.io
.*
;
{ public static void main (String[] args) throws java
.lang.Exception
{ String s=
"41500000"
;
Float value = Float
.intBitsToFloat
(Integer
.valueOf
(s
.trim
(),
16
))
;
System
.out.println
(value)
;
Float f=
13.0
f
;
System
.out.println
(Integer
.toHexString
(Float
.floatToIntBits
(f)))
;
}}
输出结果:13.0
输出结果:41500000
4.方法介绍
Float方法对浮点数与比特的相互转化
浮点数转bit
Float.floatToIntBits(float f) 将一个浮点数转成一个比特序列。返回一个32位整数,表示你作为参数提供的浮点数的 IEEE 754 比特排列。
bit转浮点数
Float.intBitsToFloat(int bits)将传入整数作为一个比特序列,按float对应位置规定意义,转成一个浮点数。
//将16进制数转换为10进制数
System.out.println(Integer.parseInt("3F800000", 16));
//1065353216
//将16位进制数转换为浮点数
System.out.println(Float.intBitsToFloat(Integer.parseInt("3F800000", 16)));
//1.0
//将浮点数转换为10进制数
System.out.println(Float.floatToIntBits(1.0f));
//1065353216
//将浮点数转换为16进制数
System.out.println(Integer.toHexString(Float.floatToIntBits(1.0f)));
//3F800000