C语言自动类型转换
所谓“各类型数据之间的混合运算”就是指,当参加一个运算的数据的类型不同时运算的法则是什么。首先变量的数据类型是可以转换的。转换的方法有两种,一种是自动转换,另一种是强制转换。
本节之讲解自动转换,强制转换将在后续章节中再讲解。
自动转换的规则如下:
1) 当参与运算的数据的类型不同时,编译系统会自动先将它们转换成同一类型,然后再进行运算。
但问题是转换的时候是谁转换成谁呢?转换的基本规则是“按数据长度增加的方向进行转换”,以保证精度不降低。比如 int 型数据和 long 型数据进行相加或相减运算时,系统会先将 int 型数据转换成 long 型,然后再进行运算。这样的话运算结果的精度就不会降低。
long 是“大水桶”,int 是“小水桶”。int 能存放的,long 肯定能存放;而 long 能存放的,int 不一定能存放。
2) 所有的浮点运算都是以双精度进行的。
在运算时,程序中所有的 float 型数据全部都会先转换成 double 型。即使只有一个 float 型数据,也会先转换成 double 型,然后再进行运算。为什么要这样呢?因为 CPU 在运算的时候有“字节对齐”的要求,这样运算的速度是最快的。这个现在先不管,如果以后有机会学习汇编的话你就知道原因了。
3) char 型和 short 型数据参与运算时,必须先转换成 int 型。这也是涉及 CPU 的运行原理的,记住就行了。
4) 有符号整型和无符号整型混合运算时,有符号型要转换成无符号型,运算的结果是无符号的。这条规则经常使人纠结,可以写一个程序看一下。
Hello
程序的意思是分别定义一个有符号整型 a 和无符号整型 b。然后分别将 –10 和 5 赋给 a 和 b,如果 a+b 的值大于 0 就输出 Hello。理论上讲 –10+5 的值为 –5,所以不可能输出 Hello。但是我们从输出的结果可以看出,Hello 被输出了。这说明 a+b 的值是正数,即是无符号的。这就是这个规则。
5) 整型和浮点型混合运算时,整型先转换成浮点型,运算的结果是浮点型。
6) 在赋值运算中,当赋值号两边的数据类型不同时,右边的类型会转换为左边的类型,然后再赋给左边。如果右边数据类型的长度比左边长,那么将会丢失数据,这样就会降低精度,所以编译的时候会产生警告。
本小节的内容大家了解一下就行了。因为在实际编程中,至少就初学而言,不同类型数据之间的混合运算是很少见的。最多也就是整型和浮点型的混合运算。但是试卷上的题目除外!
- 自动转换即当不同类型的数据进行混合运算时,编译系统将按照一定的规则自动完成。
- 而强制类型转换是由程序员通过编程强制转换数据的类型。
本节之讲解自动转换,强制转换将在后续章节中再讲解。
自动转换的规则如下:
1) 当参与运算的数据的类型不同时,编译系统会自动先将它们转换成同一类型,然后再进行运算。
但问题是转换的时候是谁转换成谁呢?转换的基本规则是“按数据长度增加的方向进行转换”,以保证精度不降低。比如 int 型数据和 long 型数据进行相加或相减运算时,系统会先将 int 型数据转换成 long 型,然后再进行运算。这样的话运算结果的精度就不会降低。
long 是“大水桶”,int 是“小水桶”。int 能存放的,long 肯定能存放;而 long 能存放的,int 不一定能存放。
2) 所有的浮点运算都是以双精度进行的。
在运算时,程序中所有的 float 型数据全部都会先转换成 double 型。即使只有一个 float 型数据,也会先转换成 double 型,然后再进行运算。为什么要这样呢?因为 CPU 在运算的时候有“字节对齐”的要求,这样运算的速度是最快的。这个现在先不管,如果以后有机会学习汇编的话你就知道原因了。
3) char 型和 short 型数据参与运算时,必须先转换成 int 型。这也是涉及 CPU 的运行原理的,记住就行了。
4) 有符号整型和无符号整型混合运算时,有符号型要转换成无符号型,运算的结果是无符号的。这条规则经常使人纠结,可以写一个程序看一下。
本程序的部分语法读者可能看不懂,没关系,忽略即可,后续我们会详细讲解。
# include <stdio.h> int main(void) { int a = -10; unsigned b = 5; if ((a+b) > 0) { printf("Hello\n"); } return 0; }在 VC++ 6.0 中的输出结果是:
Hello
程序的意思是分别定义一个有符号整型 a 和无符号整型 b。然后分别将 –10 和 5 赋给 a 和 b,如果 a+b 的值大于 0 就输出 Hello。理论上讲 –10+5 的值为 –5,所以不可能输出 Hello。但是我们从输出的结果可以看出,Hello 被输出了。这说明 a+b 的值是正数,即是无符号的。这就是这个规则。
5) 整型和浮点型混合运算时,整型先转换成浮点型,运算的结果是浮点型。
6) 在赋值运算中,当赋值号两边的数据类型不同时,右边的类型会转换为左边的类型,然后再赋给左边。如果右边数据类型的长度比左边长,那么将会丢失数据,这样就会降低精度,所以编译的时候会产生警告。
本小节的内容大家了解一下就行了。因为在实际编程中,至少就初学而言,不同类型数据之间的混合运算是很少见的。最多也就是整型和浮点型的混合运算。但是试卷上的题目除外!
所有教程
- C语言入门
- C语言编译器
- C语言项目案例
- 数据结构
- C++
- STL
- C++11
- socket
- GCC
- GDB
- Makefile
- OpenCV
- Qt教程
- Unity 3D
- UE4
- 游戏引擎
- Python
- Python并发编程
- TensorFlow
- Django
- NumPy
- Linux
- Shell
- Java教程
- 设计模式
- Java Swing
- Servlet
- JSP教程
- Struts2
- Maven
- Spring
- Spring MVC
- Spring Boot
- Spring Cloud
- Hibernate
- Mybatis
- MySQL教程
- MySQL函数
- NoSQL
- Redis
- MongoDB
- HBase
- Go语言
- C#
- MATLAB
- JavaScript
- Bootstrap
- HTML
- CSS教程
- PHP
- 汇编语言
- TCP/IP
- vi命令
- Android教程
- 区块链
- Docker
- 大数据
- 云计算