大家好 欢迎来到C++程序设计 这一讲我们要研究一下数据在程序中的表示 我们在编程的时候往往要用到各种各样的数据 比如说 我们在编写学生管理系统的时候 我们要表示学生的基本信息 包括学生的姓名 学号 班级 家庭住址等等这样的信息 那麽这样的信息在程序中都是如何进行描述的呢 我们马上就要研究一下这个问题 那麽利用计算机求解问题 首先要做的就是将数据引入到计算机中 在程序语言中是通过数据类型来描述不同的数据形式的 数据类型不同 求解问题的方法也会不同 下来我们看一下在C++语言裡面 都有哪些数据类型可以供我们使用 我们看总的来说分有这麽几大类 一类是基本类型 那麽什麽叫基本类型呢 我们说基本类型的数据是不可以再分解为其他类型的 这是基本类型的最大的特点 那麽再有一大类就是构造类型 那麽构造类型的特点就是它是通过 某种一种已经定义的或者多种已经定义的数据类型 通过某种规则构造在一起的数据类型就叫做构造类型 也就是说构造类型的数据我们可以把它分解为若干个元素 每个元素可以是一个基本类型又可以是一个构造类型 好 那麽下来我们看一下我们常用的基本类型裡面都有哪些类型 那麽就分有整形 表示的是整形数据 那麽伏点形表示的是数学上的小数 这样小数点带小数点的这种小数的这个数据 那麽字符形表示的就是字符形的数据 还有就是逻辑型和空类型 那麽在构造类型裡面就包括有数组类型 结构体类型 共用体类型 每一句类型和类类型 那麽还有一类比较重要的类型就是指针类型 指针类型它描述的不是具体的数值 而是内存中的地址 也就是说当我们要描述地址信息的时候 我们就要用到指针类型 那麽引用类型和指针类型是相类似的 那麽在这个表裡面 凡是用红色标注出来的 都是C++特有的数据类型 而用黑色描述出来的都是C语言的数据类型 那麽下来我们先学习一下我们最常用的基本数据类型 那麽基本数据类型我们在这列了一个表 那麽蓝色的这几个类型 就是我们后面的频繁要使用的 用的最多的 首先我们先看一下整形 那麽普通整形我们是用标示符int来表示 int就表示的是普通整形 那麽这样的一个数据在内存中佔几个字节呢 我们说佔4个字节 那麽前面也提到过 我们的一个数据在内存中佔的存储空间是有限的 因此它表示的数据范围也是有限的 那麽4个字节来表示 一个整形数据它的最大值最小值分别是多少呢 那麽这还也列举出来了 就是正负21亿多一点 那麽它的这个有效这个数值范围呢 我们需要就是大概记一下 不需要每一位都记得很清楚 但是应该大概知道正负21亿 那麽如果你用到特别大或者特别小的数的时候 你就能够判断它这个是不是在这个范围内了 好 那麽除了普通整形以外 还有无符号整形 什麽叫无符号整形呢 就说普通整形我们的最高位是作为符号位的 有正负值分 而无符号整形呢 它的最高位也是作为数值位的 但是这样的无符号形的数呢 它只能表示正整数 因为它没有符号位了 它只能表示正数 但是正数的这个取值范围呢 是不是就增加了 因为它多了一位 那麽还有就是短整形 无符号短整形 长整形和无符号长整形 好 那麽这还就不一一列举了 那麽再下来就是字符形 在C++裡面用chair来表示字符形 那麽它佔一个字节的存储空间 它的取值范围就是负的128到正的127 再有呢 就是表示实行数据的单进度型和双进度型 单进度我们用float表示 那麽它佔4个字节 它的取值范围呢 是3.4乘以10的-38次方 到3.4乘以10的38次方 那麽双进度型呢 它用double来表示佔的是8个字节 那麽它的取值范围呢 就更大了 那麽这4种类型呢 是我们经常要用到的4种类型 好 那麽下来呢 我们把数据类型分成 整形 实行 字符形一个一个来给大家讲述一番 首先是整形 那麽在C++语言裡面 整形分为长整形 基本整形和短整形 那麽长整形呢 用long int来表示 我们也可以简写成long 那麽短整形呢 可以简写为short 那麽一般来说 在一个系统裡面 普通整形佔的存储空间应该大于等于短整形 小于等于长整形 那麽要注意的就是 不同的数据类型规定了不同的机器数的长度 也就是说它们佔的存储空间是不一样的 那麽这个存储空间就决定了对于数据的这个数值范围 当一个整数超出此范围时 计算机会将其转换为在数值范围内所允许的一个数 称为整形数据的一一初处理 这还我们又面临著一一初的这样一个问题 那麽有一初是怎麽分类的呢 我们看 超过最大值的有符号整形数值会向上一初变成负数 那麽超过最小值的数据会向下一初变成正数 那麽这就好比我们生活中常见的物极必反 你想表示很大的数不停的变大不停的变大 反而变成了一个负数了 那麽你想表示一个很小的数不停的减小不停的减小 反而会变成一个正数了 这就是向下一初和向上一初的一个道理 那麽下来我们通过一个例子我们来看一下 假设我们有短整形的这样一个数据 佔两个字节来表示一个整数 那麽它能表示的最大的数是不是就是最高位为0 低位全部为1 那麽这个数转换成实境值就是32767 那麽现在我们在它的基础上再加上一个1 那我们看得到的结果是不是32768呢 我们看明显不是 相加的结果最高位变成1了 那麽也就是说它是不是变成一个负数了 那麽这是一个负数的补码 转换成原码就是负的32768了 也就是说32767已经是它的最大取值了 现在我还要把它往大的加 反而就变成了一个很小的负数 那麽这就是一个向上一初 那麽下来我们再看向下一初 我们说用两个字节来表示一个代符号的一个整数 那麽它能表示的最小的数就是负的32768 那麽转换成补码就是最高位为1 低位全部为0 那麽现在我们在它的基础上再减一个1 相当于就是加上一个负1 那麽负1的补码就是全部为1 好 那麽相加的结果我们看 得到了这样一个数 这个数的最高位是0 然后低15位全部为1 那麽是谁的转换成实境值是谁啊 就是32767 所以我们看最小的一个数再减去一个1 反而变成了一个比较大的一个数了 所以这就是一初产生的一个原因 好 那麽接下来我们看一下实行数据 我们也可以把它叫做伏典型数据 那麽在C++语言裡面 伏典型又称为实行 可能将来我们用实行来描述这种类型的数据 用的会比较多一些 那麽分成单进度和双进度 还有常双进度这麽三种 那麽我们常用的就是单进度和双进度 那麽float型也就是单进度 在内存中佔4个字节 它提供了7位有效数字 那麽在这我们要注意一下有效数字的这个问题 所谓有效数字指的就是 它保证在有效数字范围内的这些位 它是给你精确的来进行表示的 那麽超出有效数字的其他位 它就给你一个随机数 也就是说它的值有可能是不对的 那麽对于double型和long double型 一般佔用8个字节 那麽提供的是16位的有效数字 那麽我们在使用实行数据的时候 特别要注意这个有效数字的问题 好 我们接著看 因为浮点型数据长度是有限的 所以浮点数存在著计算误差 那麽这个计算误差就是由有效位数来 就是因为这个有效数字而产生的这样一个误差了 那麽虽然浮点数的精度越高 计算结果越精确 但其处理的时间也越长 那麽一个较大的浮点数 与一个较小的浮点数做加法运算时 由于精度限制 使得很小的浮点数被忽略了 从而使得这样的加法变得毫无意义 那麽下来我们通过一个例子来看一下 最后这一句话是什麽样的一个意思 好 我们看这个例子 那麽在这个例子裡面的12345和1213这几行 就相当于是程序的框架了 它就是有一个主函数 那麽我们只需要读主函数题裡面的 第6行到第11行就可以了 好 我们看在第6行 我用float单精度类型定义了一个变量a 然后给它附了个值0.00000678 好 那麽在这个值后面 我们为啥加上一个小写f呢 因为我们说如果我们光写0.000000 就使得这个数变成一个单精度的了 float型的了 那麽这样複制运算服左右双方的 这个数据类型就吻合了 好 那麽接下来我们用double型定义一个变量b 然后裡面放的就是也是这个数 那麽这时候这个数就不需要加上f了 好 那麽第8行 我们给a重新複制 它的新值为它原来的值再加上一个 111111.111这样的一个数 那麽这个数就是小数点前面6个1 小数点后面3个1 同样给b也重新複制 它的新值也为旧值加上这个数 好 那麽a和b都有了新值了 那麽这时候我们要对它的值进行输出 那麽第10行是一个输出格式的一个控制 它表示的就是我要以伏点数的形式来进行输出 并且保留小数点后面的16位小数 它是一个格式的一个控制 那麽由于我们这用到了这个输出格式的控制 所以我们第2行又加了一个头文件 iomanip这个头文件 就说明我们这个因为要用到格式控制了 好 那麽第11行大家都能读懂了 它是一个输出语句 先输出一个字符串a等于 再输出a的值 再输出一个逗号b等于 再输出b的值 好 那麽接下来我们观察一下运行结果 a和b是不是我们想象中得到的那个值呢 我们看我们想象a得到的一个值 如果精确计算的话 是不是就应该是111116个1 点111三个0 然后呢00678这样的一个数 但实际上我们看输出a的值是多少呢 是不是跟那个数是有误差的 那麽前面这几位 前面6个1和这个1都是精确输出的 后面是不是就乱七八糟了 我们说什麽原因产生这个问题呢 就是有效位数的问题 我们说单精度的数只有7位的有效位数 这个有效位数是不包含小数点在内的 所以我们这行就只保证了前面6个1 和这个1是一个精确的 那麽剩下超出有效位数的这些位 它就会给你一个随机数 所以我们看我们本来想让它一个很大的数 加上一个很小的数得到一个结果 但实际上加的这个小数有没有被加进去 并没有体现出来 所以我们刚才说为什麽要避免一个很大的数 和一个很小的数相加 它的原因就在这 那我们再观察一下b的值 b我们定义的时候它是一个double型双精度的 所以它的有效位数是16位 所以我们看它前面16位是精确输出的 但是到了后面是不是就也是乱七八糟的了 好 那麽这样的一个例子 一个就是提示我们避免将一个很大的数 和很小的数进行相加 因为相加的结果有可能体现不出来 那麽如果你非要相加的话 就一定要注意这个有效位数的问题 这是一个 那麽第二点提示就是 当我们在使用实行数据的时候 用double型的好还是用float型的好呢 那麽毫无疑问double型的精度更高 所以用double型的更好一些 那麽可能有同学说 那double型佔的存储空间多 这是它的一个缺点 它佔8个字节 float只佔4个字节 我们说现在计算机技术发展这麽快 存储器的存储容量也越来越大了 所以大上这麽4个字节 在普通程序裡面是没有任何影响的 那麽这就是我们的这个例子 好 那麽下来我们再来看一下字符型的这个数据 那麽在C++语言裡面 字符型数据就分为有符号和无符号这麽两种 那麽有符号和无符号的概念我们刚才介绍了 那麽总的来说它佔的是一个字节 那麽前面我们讲ASCII码的时候我们也知道了 那麽字符型数据存放在这一个字节 其实存放的是一个正整数 就是这个字符所对应的ASCII码值 好 那麽这个我们看这行也告诉我们了 比如说大写字母A 我要把它存在这一个字节裡面 8位裡面是怎麽存放的 其实存放的就是一个65这个数字 所以最高位肯定是0 因为它是一个正数 然后把65转换成一个二进制的形式 把它存放进去 这就是字符型数据的一个存储形式 就是这样子的 那麽我们需要注意的就是 在C++语言中 字符型数据和整形数据之间是可以通用的 什麽意思呢 就是说一个字符数据可以複制给整形变量 一个整形数据也可以複给字符型的变量 还可以对字符型数据进行算术运算 也就是说整形数能做的事情字符型也可以做 我们说为什麽它俩是通用的呢 其实就是我们刚才一再强调的 由于字符型的数据存放在内存中 其实存放的就是一个什麽正整数 所以它可以和整形数据一样的进行运算 那麽下来我们通过一个例子我们来看一下 好在这个例子裡面 我们第五行定义了两个整形变量I和G 然后第六行定义了两个Chair型的字符型的变量C1和C2 然后接著我们给几个变量複制了 C1裡面放了一个小写字母A 那麽单引号引起来的一个字符 就表示的就是这个字符本身了 把小写字母A放到C1裡面 那麽複制双方它都是字符型的 这个複制操作肯定没有问题了 那麽接著我们把98这个整数複给C2 C2是字符型的可不可以呢 我们说可以 其实刚才给C1複制的时候 虽然写出来的形式是把一个字符放到C1裡面去了 其实就是把97也就是A的阿斯克马值放到C1裡面去了 所以我们在这直接把98放到C2裡面是完全允许的 那麽98是小写字母B的阿斯克马值 所以相当于给C2裡面就放了一个小写字母B 好 那麽接著给I和G複制 I是一个整形的变量 给它裡面放一个字母字符可不可以呢 可以 其实放的就是大写字母A的阿斯克马值就是65了 那麽如果给G複个66那更可以了 因为它俩都是整形的了 好 那麽接著我们要对它进行输出 先输出I的值 再输出G的值 再输出C1和C2的值 那麽输出的结果我们看到了 因为I和G定义的时候是整形的 所以输出就是一个整形的数据 所以它俩一个输出65 一个输出66 而C1和C2定义的时候是chair型的 所以输出的时候它们自然就是一个字符型的方式输出 所以C1裡面放的是A C2裡面放的是B 好 那麽第12行的这个输出语句 是对C1和C2进行了一个计算 那我们说字符型数据能不能参与算术运算呀 可以 其实运算的就是它裡面放的这个整形数 那麽C1裡面放的是小写字母A的阿斯克马97 相当于就是用97和32相减 所以最后输出结果就是这样的一个结果了 好 那麽这个例子就告诉我们整形和字符性通用 这个通用体现在什麽地方 好 那麽这一讲 我们就先讲到这裡 拜拜