1、先给出实型变量取值范围
实型变量可以分为单精度(float)(4字节)、双精度(double)(8字节)、长双精度(long double)(8字节)三种类型。
在 VC6.0 double和long double型具有完全相同的长度和存储格式,它们是等同的,但其它编译器可能不同。
下面给出实型变量取值范围:
2、实型变量在C语言内存中的存放形式
首先在讨论这个问题之前,先给出实型变量在C语言内存中的存放形式:
在存储实型数据时,无论表示是小数还是指数,均以指数格式存储,即实数的存储由符号位、指数、以及尾数等三部分组成。
下面我就将标准值是怎么定义的,和你说一下:
这个比较复杂,建议你找一下IEEE754标准看一下。
其中,s 表示 sign,即符号。如果 s == 0,则浮点数 V 为正;如果 s == 1,则浮点数 V 为负。
M 表示有效数字,在 [1, 2) 之间。
而 E 则是指数位。
故float存储的数字可以写成:
(1)Sign(1位):用来表示浮点数是正数还是负数,0表示正数,1表示负数。
(2)Exponent(8位):指数部分。即上文提到数字c,但是这里不是直接存储c,为了同时表示正负指数以及他们的大小顺序,这里实际存储的是c+127。
(3)Mantissa(23位):尾数部分。也就是上文中提到的数字b。
举个例子:计算float 13.14在C语言内存中存储情况
(1)首先整数用二进制表示为1101
(2)0.14用二进制表示为:
0.14x2=0.28 整数部分 0
0.28x2=0.56 整数部分 0
0.56x2=1.12 整数部分 1
0.12x2=0.24 整数部分 0
0.24x2=0.48 整数部分 0
0.48x2=0.96 整数部分 0
0.96x2=1.92 整数部分 1
0.92x2=1.84 整数部分 1
0.84x2=1.68 整数部分 1
这怎么还不出来结果呢,无奈。。。。。。(由于涉及后面循环了,所以临时更改一个例子,机智)
emmmmm,对的,这个例子不算了,下面来看下一个例子:
举个例子:计算float 2.5在C语言内存中存储情况
(1)整数部分可以写成二进制:0010
(2)小数部分0.5可以写成二进制如下:0.1
0.5x2=1 整数部分 1
(3)故2.5用二进制表示为10.1,然后可以写成类似于科学计数法:1.01x2^1
(4)根据上面的结论可以得出指数部分为:c=1+127=128 二进制表示为:10000000
(5)尾数部分为01填入即可
最后得出float 2.5在C语言内存中存储的形式为:
0 10000000 01000000000000000000000
下面验证这个结果是否等于2.5?
https://www.h-schmidt.net/FloatConverter/IEEE754.html
3、下面开始讨论float取值范围
前面知float存储的数字可以写成 ;当b和c最大时候就是float的取值范围。
首先来看c,指数位数为11111111最大,因为这个数有特殊用途,所以要减去1得11111110
接下来看b,可知当b全为1时,11111111111111111111111
此时为最大取值范围。
故可以得出最后结果float取值范围为: