《C++程序设计教程(第3版)》——第2章,第5节类型转换

2.5 类型转换
2.5.1 赋值时的自动类型转换
如果赋值运算符两侧的类型不一致,则遵循以下几条原则进行类型转换后赋值。
1.实型量赋给整型变量
实型量赋给整型变量时,简单舍弃小数部分,将实型量的整数部分赋给整型变量,不进行四舍五入。如“int i=3.96;”,则i被赋值为3。
2.整型量赋给实型变量
整型量赋给实型变量时,数值不变,有效数字位数增加。例如,若有“float f=23;”,则f获得的值为23.0,以单精度浮点格式存储,具有6~7位有效数字;若有“double d=23;”,则d获得的值为23.0,以双精度浮点格式存储,具有15~16位有效数字。
3.整型量之间相互赋值
整型量有8种,它们分别是[signed] char、unsigned char、[signed] short、unsigned short、[signed] int、unsigned int、[signed] long、unsigned long。此处将char型量看作1字节长度的整型量。各种类型的整型量占用的字节数是不同的,按照其二进制位数的多少,区分为“长的”整型量和“短的”整型量。所谓“长的”整型量是指该整型量的二进制位数较多,所谓“短的”整型量是指该整型量的二进制位数较少。整型量之间相互赋值,系统处理为它们内存数据之间的赋值,分两种情况。
(1)“长的”整型量赋给“短的”整型量
将“长的”整型量赋给“短的”整型量时,方法是“低位截断”,将“长的”整型量的高位去掉,截取其与“短的”整型量相同位数的低位二进制位,然后进行赋值。例如,“char c=250;”将int型常量250赋给字符型变量c。250为int整型常量,在内存中的存储形式是32位二进制数 0000 0000 0000 0000 0000 0000 1111 1010。变量c是8位有符号二进制整型量,赋值原则是取250内存数据的低8位赋给c,此时c中的值是1111 1010。C++中整型量是以补码形式存放的,因此,变量c的真值是-6。
又如,“short int a=65 536;”将常量65 536赋值给变量a。常量65 536是int型量(其值是216),在内存中的存储形式是:0000 0000 0000 0001 0000 0000 0000 0000。短整型变量a在内存占16个二进制位,赋值时截取65 536内存中的低16位赋给a,此时a的16个二进制位全为0,则a的值是0,这称为赋值溢出。因为65 536超过了短整型量的数值范围(-32 768~32 767),无法直接赋值给短整型量。
(2)“短的”整型量赋给“长的”整型量
“短的”整型量赋给“长的”整型量又分成两种情况。
1)将“短的”无符号整型量赋给“长的”整型变量,方法是在“短”的无符号整型量前补0,使其长度达到“长的”整型量的位数。例如:
unsigned char c = -4;
int i;
i = c;
此例中涉及两次赋值,赋值过程中各常量、变量的内存形式如下。首先将“长的”整型量-4赋给“短的”整型变量c,c获取的值是-4的内存表示形式的低8位;再将“短的”c变量的值赋给“长的”整型变量i。因为c是无符号整型量,占8位,而i是32位,此时在c的内存内容前补0使其扩展到32位后,赋值给变量i。
-4:1111 1111 1111 1111 1111 1111 1111 1100
c: 1111 1100
i:0000 0000 0000 0000 0000 0000 1111 1100
结果:变量i的值是252。
2)将“短的”有符号整型量赋给“长的”整型量。此种情况只需做符号位扩展,即在“短的”整型量前补符号位,使其长度达到“长的”整型量的长度,然后赋值。例如:
char c = -4;
int i = c;
赋值过程中各常量、变量的内存表示形式如下:
-4:1111 1111 1111 1111 1111 1111 1111 1100
c: 1111 1100
i:1111 1111 1111 1111 1111 1111 1111 1100(扩展负号)
结果:变量i的值是-4。又如:
char c = 4;
int i = c;
赋值过程中各常量、变量的内存表示形式如下:
4:0000 0000 0000 0000 0000 0000 0000 0100
c: 0000 0100
i:0000 0000 0000 0000 0000 0000 0000 0100(扩展正号)
结果:变量i的值是4。

2.5.2 各种类型运算量混合运算时的自动类型转换
C++语言中各种类型的常量和变量之间可以混合运算。例如,已知“int a=1; double b=2;”,则可进行a+b运算。两个不同类型的量运算时,计算机内部首先将它们转换成相同数据类型的量,然后进行运算。例如,上述a+b运算,计算机首先将a的值转换为double型表示,然后与double型的b的值相加。这种转换是C++内部自动完成的,编程者必须掌握转换规则,否则编程会出问题。转换规则如图2-4所示。图2-4中横向向左的箭头表示必定转换。例如,已知“char c1, c2;”,在做c1+c2运算时,首先将c1和c2的值均转换成int型表示,再将两个int型量相加。图2-4中纵向箭头表示不同数据类型混合运算时的转换方向,规则是由低类型向高类型转换,例如,上述a+b运算将低类型int值转换成高类型double值,然后运算。所谓低类型是指占用存储字节少、数据范围小的类型,所谓高类型是指占用存储字节多、数据范围大的类型。
例如,已知“int i; float f; double d;”,则表达式10+'a'+i * f - d / i的运算顺序和类型转换过程如图2-5所示。首先计算第①步,结果是int型量,再依次计算第②~⑤步,最终整个表达式的结果的类型是double型。

掌握了混合运算时数据类型的转换规则后,读者应该能理解5/2的结果为2,5.0/2的结果为2.5的道理了,参见2.4.2节。

2.5.3 强制类型转换
前面介绍了不同类型量相互赋值时以及混合运算时的自动类型转换,但有时为了强调类型的概念或者为了满足运算符对数据类型的要求,可以显式地写出类型转换,称为强制类型转换。格式是:
<类型名> (<表达式>) 或 (<类型名>) <表达式>
例如:
int i, a;
float x, y;
double z;
i = int(x+y); 或 i = (int)(x+y);
z = double(a); 或 z = (double)a;
a = int(z) % i; 或 a = (int)z % i;

例如,i=int (x+y)的意义是将表达式x+y的值转换为int型量,赋值给变量i。类型转换运算符的优先级较高,表达式int (z) % i中运算符int优先级较高,所以首先计算int (z),即将z的值取整,再进行%运算。注意,%运算符要求运算量为整型量,必须首先将z的值强制转换为整型量,才能计算%运算符。
注意:类型强制转换的对象是表达式的值,表达式double (a)的意义是将a的值(即表达式的值)转换成double型,而变量a自身仍然是int型变量。

时间: 2025-01-20 15:00:02

《C++程序设计教程(第3版)》——第2章,第5节类型转换的相关文章

搜索引擎优化技术教程之完全版 第四章 SEO指导下的技术支持

     对搜索引擎最友好(Search Engine Friendly)的网页是静态网页,但大部分内容丰富或互动型网站都不可避免采用到相关技术语言来实现内容管理和交互功能.SEO 思想指导下的技术支持,主要是对特定代码的优化和对动态网页进行静态处理的措施.          Title 和 Meta 标签      以.html 或.htm 为扩展名的 HTML 文档称为静态网页.Meta 称为元标志,用于网页的<head >与</head>中.Meta 标签的用处很多,目前几乎

搜索引擎优化技术教程之完全版 第七章 网页级别(PageRank)

第七部分:网页级别(PageRank)      Google搜索引擎采用的核心软件称为 PageRank,这是由Google创始人开发出的一套用于网页评级的系统,是Google搜索排名算法中的一个组成部分,级别从1到10级,10级为满分,PR值越高说明该网页在搜索排名中的地位越重要,也就是说,在其他条件相同的情况下,PR值高的网站在Google搜索结果的排名中有优先权.网页级别由此成为Google所有网络搜索工具的基础.              网页级别概述 Google对网页级别的描述  

搜索引擎优化技术教程之完全版 第六章 走在钢丝绳上的SEO作弊

第六部分:走在钢丝上的搜索引擎优化作弊      由于技术型搜索引擎在网站排名过程中完全由蜘蛛程序自动完成,未有人工参与,这为那些针对排名原理而采用欺骗蜘蛛程序的手段提供成功的可能性.因此在 SEO 的发展过程中,一直伴随着关于作弊方法的讨论,成为业界关注的话题.              SEO 作弊手段      做 SEO 必须了解基本的作弊手段,目的是避免无意间采用了相关手段遭到处罚.以下是被视为作弊的常见手段: 1.关键字堆砌:      为了增加关键词的出现频次,故意在网页代码中,如

搜索引擎优化技术教程之完全版 第三章 网页优化制作

第三部分:对搜索引擎友好的网页设计制作      一般的网页设计都由网页设计师完成.设计师设计网站往往仅从美观.创意和易用的角度考虑,这对于一个期望获得搜索引擎排名优秀的商业网站来说,已经远远不够了,网站策划人员至少应该为设计师递交一份需求备忘录,提醒在设计中需要配合和注意的环节.          目录结构和 URL      URL 是统一资源定位,即每个网页的网址.路径.网站文件的目录结构直接体现于 URL.清晰简短的目录结构和规范的命名不仅有利于用户体验和网址传播,更是搜索引擎友好的体现

急求清华大学出版的JAVA程序设计教程(第五版)(作者:H.M.Deitel等施平安等翻译)的课后练习题答案…

问题描述 急求清华大学出版的JAVA程序设计教程(第五版)(作者:H.M.Deitel等施平安等翻译)的课后练习题答案- 解决方案 解决方案二:我也在找

《Oracle PL/SQL程序设计(第5版)》一一1.5 PL/SQL开发人员的资源

1.5 PL/SQL开发人员的资源 Oracle PL/SQL程序设计(第5版) O'Reilly在1995年出版了本书的第一版.当时,Oracle PL/SQL编程这本书确实造成一个小轰动.它是第一本关于PL/SQL的独立著作(也就是,不是来自于Oracle公司的).从那时开始,PL/SQL程序员的资源─图书.开发环境.工具以及网站─开始蓬勃发展.(当然,迄今为止这本书仍然是这些资源中最重要和最有价值的!) 下面这一节简要地介绍了这许多资源.要充分利用这些资源,许多资源都可以免费获得或者非常低

《Linux 高级程序设计(第三版)》——1.2 Linux开发初步

1.2 Linux开发初步 Linux 高级程序设计(第三版)1.2.1 Linux下C程序标准在Linux操作系统下进行C程序开发的标准主要有两个:ANSI C标准和POSIX标准. ANSI C标准是ANSI(美国国家标准局)于1989年制定的C语言标准,后来被ISO(国际标准化组织)接受为标准,因此也称为ISO C. POSIX标准是最初由IEEE开发的标准族,部分已经被ISO接受为国际标准. 1.ANSI CANSI C的目标是为各种操作系统上的C程序提供可移植性保证(例如Linux与W

c语言-请问怎么学好《C语言程序设计教程》

问题描述 请问怎么学好<C语言程序设计教程> 这本书下学期就要学了,可是看着迷迷糊糊,看不懂,有没有什么学习的捷径?什么配套的辅导书比较好?谢谢! 解决方案 简单来说,就是Reading+Coding. 阅读入门可以从谭浩强的<C程序设计>开始,国人所写比较符合我们的思维习惯,但是过于基础,许多细节问题没有讲到,所以看完那本可以接着看看<C语言深度解剖>. 另外还有两本国外的C语言经典著作<C程序设计语言><数据结构与算法分析--C语言描述>,可

《Adobe Illustrator CC 2014中文版经典教程(彩色版)》目录—导读

版权声明 Adobe Illustrator CC 2014中文版经典教程(彩色版) Adobe Illustrator CC Classroom in a Book (2014 release) 2015 Adobe Systems Incorporated 978-0-133-90565-6 All rights reserved. No part of this publication may be reproduced, stored in a retrieval system, or

《Adobe Illustrator CC 2014中文版经典教程(彩色版)》—第1课1.3节了解工作区

1.3 了解工作区 Adobe Illustrator CC 2014中文版经典教程(彩色版) 创建和操作文档或文件时,可使用诸如面板.工具栏和窗口之类的多种元素.这些元素的排列组合称为工作区.首次启动Illustrator时,出现的就是默认工作区:它还可以根据工作需要自行定制.比如,可以创建保存两个分别用于编辑和查看的工作区,并在工作时在它们之间切换. 下面是默认工作区各组成部分的描述,如图1.3所示. 注意: 本章的屏幕截图是在Windows系统中抓取的.具体情况可能略有不同,尤其是在使用M