定义数据类型的意义
C++语言中定义数据类型的意义有三点
- 数据类型决定存储空间
- 数据类型决定数据的取值范围
- 数据类型决定了数据可以做哪些运算
1.整型(int)数据类型的存储空间、取值范围及运算
例如int类型数据,取值范围如图1所示
定义了int型变量,那么就是4个字节,取值范围
可以做算数运算,加减乘除取余,可以做关系运算,逻辑运算,可以进行按位运算和移位运算等等。
2.浮点数的存储表示
单精度浮点数(float类型),分配4个字节存储空间,取值范围如下:
浮点数可以做加减乘除这样的算数运算,关系运算和逻辑运算,但不能做取余运算,也不可以做移位和按位运算,可见其操作不同于整数了。
今天冯老师就给你分析为什么是这个取值范围,换句话说,浮点数的内部表示是怎样的呢?
3.十进制浮点数
首先我们先看十进制浮点数,在十进制数中,通常一个浮点数可以用科学计数法表示,例如
4.十进制浮点数转换成二进制浮点数
在计算机内部,浮点数都是以二进制表示的,所以,对于十进制浮点数,要先转换为二进制浮点数。分两步
- 整数部分转换
除2取余法,如:
- 小数部分转换
乘2取整法,如:
下面是0.8125和0.6转换成二进制表示
5.二进制浮点数的尾数及规格化
二进制数也要像十进制数一样进行规格化,二进制的规格化同样是调整二进制的阶码,使二进制的有效值在1~2之间,即二进制的整数部分为1,那么,0.8125进行规格化如下所示:
计算机内部把二进制分为3段表示:(32位浮点数据)
- 第一段符号位 占1位
- 第二段阶码位 占8位
- 第三段尾数为 占23位
如果是64位双精度浮点型(double)也是3段表示
- 第一段符号位 占1位
- 第二段阶码位 占11位
- 第三段尾数为 占52位
为什么二进制规格化与十进制不同呢,我们想一想,如果二进制也像十进制一样要求整数为0,小数部分第一位非0,那么小数点后第一位肯定就是1,因为二进制非0则1,那么这个固定的1就占去了宝贵的一位,因此,就把这个1前移1位,从而增加一个有效位。因此:
0.6=0.10011001100110011001……
=1.00110011001100110011……(这样精度就多了1位)
其精度或有效为是24位
6.二进制浮点数的阶码
二进制尾数规格化提高了一位精度,但是牺牲了浮点数0的常规表示,因为规格化要求小数点前必须是1,所以即使尾数部分都是0,浮点数的有效值也是1,但是浮点数0的运算比不可少,那么0在浮点数中是如何表示的呢?float的第二段阶码位是8位,取值为-128~127,共256个值,但是-127和-128有特殊的用处,因此,阶码取值为-126~127,-128表示操作错误,如被0除或超出浮点数的表示范围,-127表示非规格化数据 为了使浮点数0和整数0统一,即位码全0表示0,将一切阶码都加了127,取出该浮点数时候再做减去127的逆操作。那么看下图
7.浮点数表示范围
对于单精度浮点型,阶码8位,可以表示正负,当尾数全1,再加上小数点前1位,阶码取到最大时为127,浮点数可以取到正负数的最大值:
精度呢?有24位表示精度,
所以精度相当于10进制的7位。