- C语言中的类型之间的转换:强制类型转换和隐式类型的转换
#include<stdio.h>
int main()
{
long l = 800;
int i = (int)l; // 强制类型转换
short s = 800;
int k = s; // 隐式类型转换,no error,no warning
return 0;
}
2. 强制类型转换
强制类型转换的语法:(Type)var_name或(Type)value
强制类型转换的结果
目标类型能够容纳目标值:结果不变
目标类型不能容纳目标值:结果将产生截断
注意:不是所有的强制类型转换都能成功,当不能进行强制类型转换,编译器将报错。
3.编程实验
强制类型转换分析
#include<stdio.h>
struct TS
{
int i;
int j;
};
int main()
{
short s = 0x1122;
char c = (char)s; // 0x22;
int i = (int)s; // 0x00001122;
int j = (int)3.1415; // 3,直接截断小数部分
struct TS ts;
unsigned int p = (unsigned int)&ts;// &ts是个地址,在32位机器上是32位
// 这里的转换是安全的,但64位是地址是64位,int是32位
// 的,所以会发生截断。
//long l = (long)ts;//error,无法将自定义的类型(TS)转为基本类型(long)
//ts = (struct TS)1;//error,无法将基本类型转为自定义类型,编译器直接报错;
printf("s = %x\n", s); // 1122
printf("c = %x\n", c); // 22
printf("i = %x\n", i); // 1122
printf("j = %x\n", j); // 3
printf("p = %x\n", p); // p等于ts的地址!
printf("&ts = %p\n", &ts); // %p显示为指针,ts的地址
return 0;
}
4. 隐式类型转换
隐式类型的转换——编译器主动进行的类型转换
char c = 0; // 变量c占用1个字节
short s = c; // c到s隐式类型转换
int i = s; // s到i隐式类型转换
long l = i; // i到l隐式类型转换
注意:
低类型到高类型的隐式类型转换是安全的,不会产生截断
高类型到低类型的隐式类型转换是不安全的,导致不正确的结果
隐式类型转换的发生点
①算术运算式中,低类型转换为高类型
②赋值表达式中,表达式的值转换为左边变量的类型
③函数调用时,实参转换为形参的类型
④函数返回值,return表达式转换为返回值类型
5.编程实验
隐式类型转换分析
#include <stdio.h>
int main()
{
char c = ‘a’; // c=97;
int i = c;// safe
unsigned int j = 0x11223344;
short s = j; // unsafe,高位截断
printf("c = %c\n", c); // c=97
printf("i = %d\n", i); // 97
printf("j = %x\n", j); // 11223344
printf("s = %x\n", s); // 3344
printf("sizeof(c+s) = %d\n", sizeof(c+s)); // c和s同时转为int型,输出4
return 0;
}
6. 小结
强制类型转换由程序员负责完成
①转换可能产生截断;
②转换不区分类型的高低
③转换不成功时,编译器给出错误信息
隐式类型转换由编译器自动完成
①低类型向高类型的转换是安全的
②高类型向低类型的转换是不安全的
★标准C编译器的类型检查是比较宽松的,因此隐式类型转换可能带来意外的错误
————————————————
版权声明:本文为CSDN博主「小虾米_2018」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_22847457/article/details/98254486