在C语言中,当使用多个不同数据类型的变量进行数据运算时,有两种方法可以将同一表达式中不同数据类型的数据转换成同一类型的数据,分别是自动类型转换和强制类型转换(sizeof)。
其中自动类型转换有如下基本规则:
1、当出现在表达式里时,有符号和无符号的char和short类型都将自动被转换为int,在需要的情况下,将自动被转换为unsigned int。
2、在包含两种数据类型的任何运算里,两个值都被转换成两种类型里较高的级别,因为是转换成较大的类型,所以这些转换被称为提升。
3、类型级别从高到低的顺序是long double、double、float、unsigned long、long、unsigned int和int。之所以short和char类型没有出现在此清单中,是因为它们已经被提升到int或也可能被提升到unsigned int。
4、在赋值语句里,计算的最后结果被转换成将要被赋予值的那个变量的类型。这个过程可能导致提升;但也可能导致降级,降级是将一个值转换成一个更低级的类型。
5、当作为函数的参数被传递时,char和short会被转化为int,float会被转换为double。
需要注意的是,提升通常是一个平滑的无损害的过程,但是降级可能导致问题。因为一个较低级别的类型可能不够大,不能存放一个完整的数。如:一个8位的char变量可以存放整数101,但不能存放整数22334;当把浮点类型降级为整数类型时,它们会被趋零截尾或舍入。
基于以上原理,书上举出了一个例子:
int i;
float a=3.5;
i=1;
i=i+a;
对于最后一句i=i+a,书上说i最后的值为4。
对此我表示疑惑,根据第3条基本规则:float级别高于int,那为什么最后i的值不会是4.5?
随后我上机开始试验,如图1。
图1:
在这个程序中,最后的printf输出的就是%d类型,我认为即使i为4.5,结果也会因为被截尾而变成4,所以这个程序并不能说明问题。
因此我对程序作了修改,将printf中i的输出类型改为%f,如图2。
图2:
修改后,程序虽然通过了编译,但是却不能输出结果。
经过前2例,我有了如下判断:
1、printf函数中,指定的输出类型和输出表列的类型如果不一致,能通过编译,但是不能正确输出结果。
2、如果i的值为4.5,那么图2中的printf应该能正确输出结果。所以,程序中最后i的值为4,而且并不是由于printf的%d截尾。
那么,i+a作为不同数据的混合类型运算,基本规则里的第3条又是怎么发挥作用的?
这就有了两种猜想:一种是先把a截尾变成3,再和i相加,最后得到4,就相当于是降级;另一种是先把i的值转化为float型数据1.0(此处相当于提升),再和a相加,最后得到4.5,由于一开始i是定义为int型,所以这里把4.5进行截尾操作得到4。
利用之前的判断1,对程序做了如下的修改,如图3。
图3:
根据图3,能判断出i+a的值为4.5,因为指定输出类型为%d的printf不能输出结果,而指定输出类型为%f的printf可以正确输出。由此可见,猜想2是正确的,
结论:系统在计算本例时,先把i的值转化为float型数据1.0,再和a相加,最后得到4.5,由于一开始i是定义为int型,所以这里把4.5进行截尾操作得到4,最后再把4赋值给整型变量i。
以上观点均为个人看法,如有错误,欢迎大家批评指正
其中自动类型转换有如下基本规则:
1、当出现在表达式里时,有符号和无符号的char和short类型都将自动被转换为int,在需要的情况下,将自动被转换为unsigned int。
2、在包含两种数据类型的任何运算里,两个值都被转换成两种类型里较高的级别,因为是转换成较大的类型,所以这些转换被称为提升。
3、类型级别从高到低的顺序是long double、double、float、unsigned long、long、unsigned int和int。之所以short和char类型没有出现在此清单中,是因为它们已经被提升到int或也可能被提升到unsigned int。
4、在赋值语句里,计算的最后结果被转换成将要被赋予值的那个变量的类型。这个过程可能导致提升;但也可能导致降级,降级是将一个值转换成一个更低级的类型。
5、当作为函数的参数被传递时,char和short会被转化为int,float会被转换为double。
需要注意的是,提升通常是一个平滑的无损害的过程,但是降级可能导致问题。因为一个较低级别的类型可能不够大,不能存放一个完整的数。如:一个8位的char变量可以存放整数101,但不能存放整数22334;当把浮点类型降级为整数类型时,它们会被趋零截尾或舍入。
基于以上原理,书上举出了一个例子:
int i;
float a=3.5;
i=1;
i=i+a;
对于最后一句i=i+a,书上说i最后的值为4。
对此我表示疑惑,根据第3条基本规则:float级别高于int,那为什么最后i的值不会是4.5?
随后我上机开始试验,如图1。
图1:
在这个程序中,最后的printf输出的就是%d类型,我认为即使i为4.5,结果也会因为被截尾而变成4,所以这个程序并不能说明问题。
因此我对程序作了修改,将printf中i的输出类型改为%f,如图2。
图2:
修改后,程序虽然通过了编译,但是却不能输出结果。
经过前2例,我有了如下判断:
1、printf函数中,指定的输出类型和输出表列的类型如果不一致,能通过编译,但是不能正确输出结果。
2、如果i的值为4.5,那么图2中的printf应该能正确输出结果。所以,程序中最后i的值为4,而且并不是由于printf的%d截尾。
那么,i+a作为不同数据的混合类型运算,基本规则里的第3条又是怎么发挥作用的?
这就有了两种猜想:一种是先把a截尾变成3,再和i相加,最后得到4,就相当于是降级;另一种是先把i的值转化为float型数据1.0(此处相当于提升),再和a相加,最后得到4.5,由于一开始i是定义为int型,所以这里把4.5进行截尾操作得到4。
利用之前的判断1,对程序做了如下的修改,如图3。
图3:
根据图3,能判断出i+a的值为4.5,因为指定输出类型为%d的printf不能输出结果,而指定输出类型为%f的printf可以正确输出。由此可见,猜想2是正确的,
结论:系统在计算本例时,先把i的值转化为float型数据1.0,再和a相加,最后得到4.5,由于一开始i是定义为int型,所以这里把4.5进行截尾操作得到4,最后再把4赋值给整型变量i。
以上观点均为个人看法,如有错误,欢迎大家批评指正
发表评论
-
SQL:目录
2013-05-04 22:42 532第一章:关系型数据库管理系统概述 http://131 ... -
SQL:第六课
2013-04-26 17:37 651一、Sybase.PowerDesigner.15.0 二、 ... -
SQL:第五课
2013-04-26 17:34 840第六章: 第七章: 第八章: -
SQL:第四课
2013-04-20 18:56 867第五章: 练习1: USE ... -
SQL:第三课
2013-04-20 11:27 667第四章:DML语句 练习: CREATE DATABA ... -
SQL:第二课
2013-04-17 22:11 736第二章: 第三章: 第二章作业:简易大学教学管理数据库 ... -
SQL:第一课
2013-04-16 22:09 771... -
C语言:目录
2013-04-15 23:11 605第一章:软件开发概述 http://131947319 ... -
C语言:第九课
2013-04-15 22:54 638一、C语言的数据类型包括基本类型(整形,字符型,浮点型),指针 ... -
C语言:第八课
2013-04-15 22:36 710一、在C语言程序设计时 ... -
C语言:第七课
2013-04-15 21:47 565一、数组:按一定顺序排列,具有某种相同性质的同类型变量的集合。 ... -
C语言:第六课
2013-04-06 22:47 570一、循环控制语句控制一个代码块多次执行,直到某个条件满足。重复 ... -
C语言:第五课
2013-04-02 22:41 905一、所有程序在执行时,程序中的语句按其先后顺序执行。这种按照语 ... -
C语言:第四课
2013-04-01 21:28 788一、浮点类型的除法 ... -
C语言:关于溢出
2013-03-31 14:19 1725对于变量的值超出其定 ... -
C语言:第三课
2013-03-30 21:03 9011、计算机在通电状态下 ... -
C语言:第二课
2013-03-28 22:05 10701、C程序是以函数为基 ... -
C语言:第一课
2013-03-27 21:52 7911、软件是为了完成某些特定功能而编制的一到多个程序文件的集合。 ...
相关推荐
C语言中强制数据类型转换的总结 C语言中强制数据类型转换是非常重要的,需要逐步进行,有些是自然的转型,有些需要根据需要强制转换。下面我们将详细讨论数据类型转换的规则和机制。 首先,需要了解数据类型转换的...
在C语言中,算术转换是指在不同数据类型之间进行运算时,系统自动将较小的数据类型提升到较大的数据类型,以确保计算的正确性。这种提升过程被称为类型提升或者类型转换。本文通过两个简单的程序例子来说明C语言中的...
本篇文章将详细探讨C语言中的三种主要类型转换:自动类型转换、强制类型转换以及指针类型的转换。 ### 自动类型转换 (Implicit Type Conversion) 自动类型转换,也称为隐式类型转换,是指在某些操作中,编译器会...
1. **字符到整数**:字符型数据会自动转换为整型数据。 2. **短整型到整型**:`short` 类型数据在计算时会被转换为 `int` 类型。 3. **浮点型到双精度**:`float` 类型数据在运算时会被转换为 `double` 类型,以提高...
C语言提供了两种主要的转换方式:隐式转换(也称为自动转换)和显式转换。 1. 隐式转换: 隐式转换是编译器自动进行的转换,无需程序员明确指定。它通常发生在以下几种情况: - **一般算术转换**:在不同数据...
1、类型自动转换 使用条件:算术表达式中不同数据类型的量进行混合运算时 转换原则:参与运算的量类型不同,则先转换成同一类型,然后进行运算 转换规则:如图1所示,高浮点数的转换规则为向左的箭头表示必定的...
在C语言中,数据类型是编程的基础,它们定义了变量可以存储的数据种类。C语言提供了多种数据类型,包括整型、字符型、浮点型、枚举类型、指针类型和空类型等。整型数据类型包括short、int、long和long long,用于...
C语言数据类型转换是指在不同数据类型的量混合运算时,由编译系统自动完成的类型转换过程。以下是C语言数据类型转换的详细知识点: 1. 数据类型转换发生在不同数据类型的量混合运算时,由编译系统自动完成。 2. ...
数据类型转换指的是在C语言中不同数据类型之间的转换,这些转换主要分为算术类型转换、赋值类型转换、强制类型转换三种类型。了解和掌握这些转换对于编写高质量的C语言程序至关重要。 首先,我们要明确数据类型的...
在C语言中,数据类型转换是一项基础且至关重要的技能,它涉及到不同类型的数据之间的相互转化。C语言提供了多种数据类型,包括基本类型(如int、char、float、double等)、构造类型(如数组、结构体)以及枚举类型等...
C语言数据类型转换的规则和实践 C语言数据类型转换是指在不同的数据类型之间进行转换,以适应不同的运算和赋值操作。在C语言中,数据类型转换可以分为隐式转换和强制转换两种形式。隐式转换是由编译器自动完成的,...
在C语言中,数据类型的转换是编程过程中必不可少的一部分,它涉及到不同数据类型的变量在运算或赋值时如何相互适应。本文将深入探讨C语言中的隐式转换和显式转换。 首先,让我们了解**隐式转换**,也称为自动转换。...
例如,int类型与double类型相加时,int会被自动转换为double。 ### 三、强制类型转换 强制类型转换是指由程序员明确指定的数据类型转换。这通常通过类型转换运算符来实现。语法结构为:(目标类型)原变量。例如,将...
### STM32中的C语言数据类型 #### 一、C语言中的数据类型 在STM32微控制器的编程中,正确地理解和使用C语言的数据类型至关重要。不同的数据类型不仅决定了变量能够存储的数据范围,还影响着内存占用以及计算效率。...
C语言数据类型转换 C语言中的数据类型转换是指在不同的数据类型之间进行相互转换,以便在编程中实现灵活的数据处理。根据C语言的规则,在不同的数据类型之间进行运算时,需要进行自动类型转换,以保证精度不降低。 ...
自动转换是指在某些特定情况下,编译器会自动地将一种数据类型转换为另一种数据类型。这种转换通常发生在以下几种情况: 1. **算术运算符**: 当不同数据类型的值进行算术运算时,较小的数据类型会被提升为较大的...
* 数据类型丰富,包括整型、浮点型、字符型、数组类型、指针类型、结构体类型、共用体类型等 * 具有结构化的控制语句,如if…else语句、while语句、do…while语句、switch语句、for语句等 * 允许直接访问物理地址,...
标题为“论二级C语言之类型的自动转换”,所讲述的是C语言编程中类型自动转换的相关概念,以及如何在编写程序时处理不同数据类型的转换,以确保程序的正确性和效率。 描述中并没有提供额外的信息,标签指明文档主要...