- 隐式类型转换(基于基本数据类型(数值),同种类型的数据才能直接运算)
- 准则一:在表达式中,有无符号的char或short会被自动转换为int类型参与运算
- (字符型,ASCII码对应十进制97)'a'+(short类型)12 =(以%d格式输出得到的结果) 109;
- 准则二:包含两种数据类型的任何任何运算中,两个值都被转成两种类型中较高的类型,然后再计算。混合运算中,参照先算乘除再算加减,先参与运算的先进行类型转换(乘除部分),加减部分从左到右依次运算,最终会转换为参与运算中的数据类型最大的类型
- (假设为int类型)2+(double类型)3.4 =(以%f格式输出得到的结果) 5.4;
- 准则三:在赋值语句中,会被转换成赋值运算符左侧的类型,可能升级也可能降级
- int a = 12.23; double截断转int,降级(实际应用中,会出现警告,但是这种隐式类型转换是合法的,只会导致丢失精度)
- double d = 12; int转double,升级(升级过程不是将12赋值给d之后才转换,而是12先升级为double类型之后才进行赋值)
- 特殊点一:
- 32位操作系统下,long和int都是4个字节的数据类型,此时unsigned int > long
- 64位操作系统下,long为8个字节的数据类型,此时long > unsigned int
- 类型级别高到低顺序:
- 排名没有涉及到char和short,因为已经被提升到int或者unsigned int
- 特殊点二:
- 只写一个不加任何后缀的小数如:3.3,会自动默认为double类型,会占用8个字节。加上后缀f,会被视为float类型,占用4个字节。
- C 语言中 printf 输出 double 和 float 都可以用 %f 占位符 可以混用,而 double 可以额外用 %lf。
- 而 scanf 输入情况下 double 必须用 %lf,float 必须用 %f 不能混用。
- 特殊点三:
- 隐式类型转换就是在上述情况下由系统自发进行的,有的非上述情况也存在自动转换的情况,这就是编译器的个人行为,比如malloc在vs能够正常使用,在其他编译不行。有的编译器会将malloc出来的内存空间进行隐式或者显式类型转换,但是有的编译器不会,这是编译器自发的行为属性
- 准则一:在表达式中,有无符号的char或short会被自动转换为int类型参与运算
- 显式类型转换
- 类型一:参与运算的两个数据转换为类型较小的数据类型
- (int类型)12+(double强制转换为int类型)(int)12.2 = (int类型)24;
- 类型二:数据类型大的赋值给类型小的,得到的结果是余数
- unsigned char c = (unsigned char)1234;此时c的值为210,计算过程为1234%256(256为无符号char型最大的数据个数)
- 类型一:参与运算的两个数据转换为类型较小的数据类型
- 指针的强制类型转换(只有SIZEOF(TYPE A) >= SIZEOF(TYPE B)时,A对B的指针强制转换合法)
- 错误示例一:越界操作
- int a =12; double *p = (double *)&a; a为4字节的变量,内存空间强制转换为8字节的,就会越界操作4字节的
- 合法示例一:占用内存大小相同,数据类型不同的强转
- int a = 12; float *p = (float *)&a; *p =23.3; 虽然合法,但是运行会出错
- 合法示例二:对8字节内存的各部分进行划分操作
- double d = 12; int *p1 = (int *)&d;
- *p1 = 23; 操作前面四字节 *(p1+1) = 24; 操作后面四字节 *((int *)((short *)p1+1)) = 12;操作中间四字节
C语言-显/隐式类型转换详解
最新推荐文章于 2025-03-24 16:50:25 发布