您的位置:首页 > 其它

第4课 类型转换

2016-03-23 23:21 232 查看
1. 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. 强制类型转换

(1)强制类型转换的语法:(Type)var_name(Type)value

(2)强制类型转换的结果

  ①目标类型能够容纳目标值:结果不变

  ②目标类型不能容纳目标值:结果将产生截断

(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;
}


3. 隐式类型转换

(1)隐式类型的转换——编译器主动进行的类型转换

  char c = 0; //变量c占用1个字节

  short s = c; //c到s隐式类型转换

  int i = s; //s到i隐式类型转换

  long l = i; //i到l隐式类型转换

▲注意:低类型到高类型的隐式类型转换是安全的,不会产生截断

高类型到低类型的隐式类型转换是不安全的,导致不正确的结果

(2)隐式类型转换的发生点

  ①算术运算式中,低类型转换为高类型

  ②赋值表达式中,表达式的值转换为左边变量的类型

  ③函数调用时,实参转换为形参的类型

  ④函数返回值,return表达式转换为返回值类型



【编程实例】隐式类型转换分析

#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;
}


4. 小结

(1)强制类型转换由程序员负责完成

  ①转换可能产生截断;

  ②转换不区分类型的高低

  ③转换不成功时,编译器给出错误信息

(2)隐式类型转换由编译器自动完成

  ①低类型向高类型的转换是安全的

  ②高类型向低类型的转换是不安全的

★标准C编译器的类型检查是比较宽松的,因此隐式类型转换可能带来意外的错误
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: