整数的存储方式:计算机用二进制来表示整数,最高位是符号位
首先了解如何用二进制表示小数(也就是如何把十进制小数转化为二进制表示):
举一个简单例子,十进制小数 10.625
1)首先转换整数部分:10 = 1010b
2)小数部分0.625 = 0.101b
(用“乘2取整法”:0.625*2=1.25,得第一位为1,0.25*2=0.5,得第二位为0,0.5*2=1, 得第三位为1,余下小数部分为零,就可以结束了)
3)于是得到 10.625=1010.101b
换个表示方式更加深入理解:
1*(10^1)+0*(10^0)+6*(10^-1)+2*(10^-2)+5*(10^-3) =
1*(2^3) + 0*(2^2) + 1*(2^1) + 0*(2^0) + 1*(2^-1) + 0*(2^-2) + 1*(2^-3)
4) 类似十进制可以用指数形式表示:
10.625=10625*(10^-3)
所得的二进制小数也可以这样指数形式表述:
1010.101b=1010101 * (2^-3)
也就是用有效数字a和指数e来表述: a * (2^e)
用一个32bit的空间(bit0~bit31)来存储这么一个浮点数,如此分配存储空间:
bit0 ~ bit22 共23bit,用来表示有效数字部分,也就是a,本例中a=1010101
bit23 - bit30 共8个bit,用来表是指数,也就是e,范围从-128到127,实际数据中的指数是原始指数加上127得到的,如果超过了127,则从-128开始计,所以这里e=-3表示为124
bit31 为符号位,1表示负数,这里应该为0
把上述结果填入32bit的存储器,就是计算机表示小数10.625的形式。
注意这个例子的特殊性:它的小数部分正好可以用有限长度的2进制小数表示,因此,而且整个有效数字部分a的总长度小于23,因此它精确的表示了10.625,但是有的情况下,有效数字部分的长度可能超过23,甚至是无限多的,那时候就只好把后面的位数截掉了,那样表示的结果就只是一个近似值而非精确值;显然,存储长度越长,精度就越高,比如双精度浮点数长度为64位,1位符号位,11位指数位,52位有效数字。
1, IEEE的浮点数格式
短(单精度float)实数: 32位 1位符号 8位指数 23位尾数
长(双精度double)实数:64位 1位符号 11位指数 52位尾数
2, float和double都的尾数含有一个隐含为1,扩展性双精度则没有这个限制
3, 小数转换成二进制时,指数需要加上127
以单精度为例,阐述将10.25与二进制互相转换过程:
A, 将10.25转换成二进制数,
a, 转换整数部分 10 = 1*(2^3)+0*(2^2)+1*(2^1)+0*(2^0)
b, 转换小数部分,使用"乘2取整"的办法 (0.25*2=0.5) 0 (0.5*2=1) 1 0.25=01
c, 把数字写成规格化的二进制数形式, 10.25=1010.01=1.01001*(2^3) 3就是指数 1.01001舍弃最高位的1变成就是尾数01001(为什么要舍弃,因为1是隐含位,即所有的小数转换后整数部分都是1)
d, 将指数加上127转换成二进制就得到了8位的指数位 3+127 = 130 转换成二进制 1000 0010
e, 根据浮点数的格式可以写出10.25的二进制数表示了:
10.25的二进制数是: 0 1000 0010 01001 0000 0000 0000 0000 000
B,将二进制数还原成浮点数:0 1000 0010 01001 0000 0000 0000 0000 000
a, 去掉最高位的符号位变成 1000 0010 01001 0000 0000 0000 0000 000
b, 取用来表示指数的8位 1000 0010 因为在浮点数转换成二进制是指数是加过127的,所以这时要减去127,130-127=3,所以指数是3
c, 取剩下的23位 01001 0000 0000 0000 0000 000, 这23位实际上就是小数部分,在浮点数转换成二进制时,我们舍弃了最高位的1,所以要补回来当做整数,就变成了1.01001 0000 0000 0000 0000 000,由于指数是3,所以要乘上我们的指数,
1.01001 0000 0000 0000 0000 000 * (2^3) = 1010.01 0000 0000 0000 0000 000
d, 将1010.01 0000 0000 0000 0000 000小数点左边的转换成十进制整数就是10,进小数点右边转换成小数就是0.25=(0*2^(-1)+1*(2^-2))
整形数据在内存中是以2进制本数的补码存在的;
但正整数的补码还是原来的2进制,而负数则要先取反再+1才是它的补码,(
+1后的最左边以为就是符号位,1为负,0为正;
)比如-10的二进制:
1、先取-10的绝对值的二进制数值,为0000000000001010;
2、取反,1111111111110101
3、加1:1111111111110110; 这个就是-10在内存中的储存形式;
浮点数的存储方式:首先了解如何用二进制表示小数(也就是如何把十进制小数转化为二进制表示):
举一个简单例子,十进制小数 10.625
1)首先转换整数部分:10 = 1010b
2)小数部分0.625 = 0.101b
(用“乘2取整法”:0.625*2=1.25,得第一位为1,0.25*2=0.5,得第二位为0,0.5*2=1, 得第三位为1,余下小数部分为零,就可以结束了)
3)于是得到 10.625=1010.101b
换个表示方式更加深入理解:
1*(10^1)+0*(10^0)+6*(10^-1)+2*(10^-2)+5*(10^-3) =
1*(2^3) + 0*(2^2) + 1*(2^1) + 0*(2^0) + 1*(2^-1) + 0*(2^-2) + 1*(2^-3)
4) 类似十进制可以用指数形式表示:
10.625=10625*(10^-3)
所得的二进制小数也可以这样指数形式表述:
1010.101b=1010101 * (2^-3)
也就是用有效数字a和指数e来表述: a * (2^e)
用一个32bit的空间(bit0~bit31)来存储这么一个浮点数,如此分配存储空间:
bit0 ~ bit22 共23bit,用来表示有效数字部分,也就是a,本例中a=1010101
bit23 - bit30 共8个bit,用来表是指数,也就是e,范围从-128到127,实际数据中的指数是原始指数加上127得到的,如果超过了127,则从-128开始计,所以这里e=-3表示为124
bit31 为符号位,1表示负数,这里应该为0
把上述结果填入32bit的存储器,就是计算机表示小数10.625的形式。
注意这个例子的特殊性:它的小数部分正好可以用有限长度的2进制小数表示,因此,而且整个有效数字部分a的总长度小于23,因此它精确的表示了10.625,但是有的情况下,有效数字部分的长度可能超过23,甚至是无限多的,那时候就只好把后面的位数截掉了,那样表示的结果就只是一个近似值而非精确值;显然,存储长度越长,精度就越高,比如双精度浮点数长度为64位,1位符号位,11位指数位,52位有效数字。
1, IEEE的浮点数格式
短(单精度float)实数: 32位 1位符号 8位指数 23位尾数
长(双精度double)实数:64位 1位符号 11位指数 52位尾数
2, float和double都的尾数含有一个隐含为1,扩展性双精度则没有这个限制
3, 小数转换成二进制时,指数需要加上127
以单精度为例,阐述将10.25与二进制互相转换过程:
A, 将10.25转换成二进制数,
a, 转换整数部分 10 = 1*(2^3)+0*(2^2)+1*(2^1)+0*(2^0)
b, 转换小数部分,使用"乘2取整"的办法 (0.25*2=0.5) 0 (0.5*2=1) 1 0.25=01
c, 把数字写成规格化的二进制数形式, 10.25=1010.01=1.01001*(2^3) 3就是指数 1.01001舍弃最高位的1变成就是尾数01001(为什么要舍弃,因为1是隐含位,即所有的小数转换后整数部分都是1)
d, 将指数加上127转换成二进制就得到了8位的指数位 3+127 = 130 转换成二进制 1000 0010
e, 根据浮点数的格式可以写出10.25的二进制数表示了:
10.25的二进制数是: 0 1000 0010 01001 0000 0000 0000 0000 000
B,将二进制数还原成浮点数:0 1000 0010 01001 0000 0000 0000 0000 000
a, 去掉最高位的符号位变成 1000 0010 01001 0000 0000 0000 0000 000
b, 取用来表示指数的8位 1000 0010 因为在浮点数转换成二进制是指数是加过127的,所以这时要减去127,130-127=3,所以指数是3
c, 取剩下的23位 01001 0000 0000 0000 0000 000, 这23位实际上就是小数部分,在浮点数转换成二进制时,我们舍弃了最高位的1,所以要补回来当做整数,就变成了1.01001 0000 0000 0000 0000 000,由于指数是3,所以要乘上我们的指数,
1.01001 0000 0000 0000 0000 000 * (2^3) = 1010.01 0000 0000 0000 0000 000
d, 将1010.01 0000 0000 0000 0000 000小数点左边的转换成十进制整数就是10,进小数点右边转换成小数就是0.25=(0*2^(-1)+1*(2^-2))