(1)、数据类型的本质:
- 概念:各种不同的数据类型,本质上是用户与系统对某一块内存数据的解释方式的约定。
- 推论:
- 类型转换,实际上是对先前定义时候的约定,做了一个临时的打破。
- 理论上,可以对任意的数据做任意的类型转换,但转换之后的数据解释不一定有意义。
- 解析:
(2)、类型转换
- 概念:不一致但相互兼容的数据类型,在同一表达式中将会发生类型转换。
- 转换模式:
- 隐式转换:系统按照隐式规则自动进行的转换
- 强制转换:用户显式自定义进行的转换
- 隐式规则:从小类型向大类型转换,目的是保证不丢失表达式中数据的精度

#include <stdio.h>
int main(int argc, char const *argv[])
{
// (1)、隐式转换的示例
// 1、加减
char ch1 = 'a';
int num1 = 100;
float f1 = 3.14;
float f2 = ch1+num1-f1; // 在该表达式中,所有的操作将会被提升为float
printf("f2 == %f\n", f2);
// 2、乘除(实际开发中遇到的,触摸屏的坐标(1024*600) 转为(800*480))
float x = 200/1024*800; // 在该表达式中,如果没有小数的参数,即执行int的int运算(int只存储整数、不存储小数)
printf("x = %f\n", x);
// 应改为:
float y = 200/600.0*480; // 在该表达式中,有小数的参与,则提升为浮点型运算(可以存储小数数据了)
printf("y = %f\n", y);
// (2)、强制转换的示例
// 1、强制在int型上操作
char ch2 = 'a'; // 单字节的整型(字符型)
int num2 = 100; // 四字节的整型
float f3 = 3.14; // 四字节的浮点型
float f4 = ch2+num2-(int)f3 ; // 在该表达式中,强制让其操作数降低为int型(所以精度会下降,小数不会在计算了)
printf("f4 == %f\n", f4);
// 2、将大作用域范围的变量,强制转换为小作用域的范围的变量
unsigned int num3 = 123456; // 二进制: 0000 0000 0000 0001 1110 0010 0100 0000
unsigned char ch3 = (char)num3; // 二进制: 0100 0000(为什么是unsigned型?因为这样就无需考虑符号位的问题了)
printf("ch3 == %d\n", ch3);
printf("ch3 == %c\n", ch3);
return 0;
}