理解浮点数的构成我的以为对于新手是一个比较困难的事,我就想了很久,看了好几篇参考资料,才大概弄清。。。spa
下面就说一下本身的理解吧~code
关于单精度浮点型的构造:内存
通常6-8位有效数字(假设float占4个字节,一个符号位,8个指数位,23个尾数。
ci
上面给出了浮点数的表示方法,6-8位有效数字大概就是10^6到10^8个数(通常超过7位就四舍五入了),这个与编译器有关。其实,也就是说float里面有2^23=83886087个数,对应大概能表示10^6—10^8个数。一个符号位就是正负的符号0或1,还有8个指数位因为有正负也就是-127~128。编译器
说道这里,你们感受多是懂了,不过颇有可能仍是没懂。编译
我给出问题,float能表示的大概的范围-3.4E38~3.4E38,这个数又是怎么来的? table
咱们知道计算机是以二进制来存取数据的,二进制也有其对应的浮点数形式。好比,1001.101.转换成10进制就是9.625.而对于IEEE标准要求浮点数必须是规范的,小数点左侧必须为1.这样,就变为1.001101*2^3(这里要注意,没错,二进制的科学技术法就是2的n次幂)。因此,对应的32为表示以下。扩展
符号位0|指数幂 10000010|尾数 00110100000000000000000数据类型
这里咱们看到尾数第一个1省略了,由于IEEE规定了小数点第一位是1,因此能够将这个符号位添加到后面来保存更多的数据。二进制
指数位是这样理解的,由于浮点数2进制的指数范围为-127~128,而8位2进制数能表示的数的范围0-255(无符号数,不要把这个指数幂当成有符号数),因此这里要有一个误差(须要多思考一下)好比,当实际的指数值为0的时候,在2进制的指数位表示为127(实际值=e—127).因此,当实际值为3的时候,e=130(也就是指数位为130,10000010)
最后再举一个例子,
-6.5
符号位1|指数幂 10000001|尾数 10101000000000000000000
如今应该知道那个范围是怎么算出来的吧,
截图就是2^128的结果(浮点数的大体范围由指数位来决定)。
(说的可能仍是有点混乱,以后若是更好的解释思路回来修改一下)
下面是一个C++中有关基本数据类型的表格:
类型 |
含义 |
最小尺寸 |
bool |
布尔类型 |
未定义 |
char |
字符 |
8位 |
wchar_t |
宽字符 |
16位 |
char16_t |
Unicode字符 |
16位 |
char32_t |
Unicode字符 |
32位 |
short |
短整型 |
16位 |
int |
整型 |
16位 |
long |
长整形 |
32位 |
long long(C++ 11) |
长整形 |
64位 |
float |
单精度浮点型 |
6-8位有效数字(假设float占4个字节,一个符号位,8个指数位,23个尾数。2^23=83886087位,2^8<=>(-128~128)\ Float表示-2^128~2^128 内存中 符号位[]+(只存放指数)指数位[][][][][][][][]+尾数[]*23) |
double |
双精度浮点型 |
10位有效数字 |
long double |
扩展精度浮点型 |
10位有效数字 |