CCF中学生计算机程序设计入门-06C++数据类型转换
1 数据类型转换
在C++中,数据类型转换(也称为类型转换)是将一种数据类型的值转换为另一种数据类型的过程
例如为了保持小数可以将整形转换为浮点型
int a=5;
float b=a;//隐式地将int转换float
数据类型转换有自动类型转换和强制类型转换转换2种
2 自动类型转换
1) 自动类型转换 往数据类型长的方向转换 保证精度不丢失
比如 int和long long 运算会转换成long long
#include<iostream>
using namespace std;
/*
自动类型转换 往数据类型长的方向转换 保证精度不丢失
比如 int和long long 运算会转换成long long
*/
int main(){
int a=4;
long long b=9;
cout<<"a占用字节数: "<<sizeof(a)<<endl;//整形4个字节
cout<<"b占用字节数: "<<sizeof(b)<<endl;//长整形8个字节
cout<<"a+b占用字节数: "<<sizeof(a+b)<<endl; //长整形8个字节
return 0;
}
运行结果
2) 赋值运算
在赋值运算中,赋值号两边的数据类型不相同时,把右边表达式的值的类型转换为左边变量的类型,如果把右边表达式的值数据类型长度比左边长,将丢失一部分数据
#include<iostream>
using namespace std;
int main(){
double d = 123.45;
int i = d; // i现在是123,小数部分被丢弃
cout<<"整型i的值为: "<<i<<endl;
return 0;
}
运行结果
3 强制类型转换
当自动类型转换不能转换时,可以显示进行类型转换,称强制类型转换
强制类型转换可以对变量进行强制类型转换和对表达式进行强制类型转换
1) 变量强制类型转换
(类型名) 变量名
int a=10;
long long b= (long long ) a;//把变量a的类型从int强制转换成long long
示例1
#include<iostream>
using namespace std;
/*
求2个数之和
*/
int main(){
int a=2147483647;
int b=10;
long long c= (long long ) a + b;//把a的类型从int转换成long long
cout<<c<<endl;//c的结果为2147483657
return 0;
}
运行结果
思考
如果不进行数据转换会如何?
2) 表达式强制类型转换
(类型名) (表达式)
示例2
#include<iostream>
using namespace std;
/*
对表达式进行类型转换
float a=2.4;
float b=3.3;
(int)(a+b)
a+b=5.7,然后把5.7转化为int 向下取整为5
*/
int main(){
float a=2.4;
float b=3.3;
int c=2;
int d= (int)(a+b)+c;//5+2=7
cout<<"d的值为:"<<d<<endl;//输出d的值
return 0;
}
运行结果
4 字符型和整形的转换
字符存放到内存不是存放字符本身,而是存放字符对应的ASCII码,具体ASCII可以参考拓展的ASCII码表
常用字符的ASCII码 ,A的ASCII码65,a的ASCII码97,0的ASCII码48
1) 字符赋值整形
#include<iostream>
using namespace std;
/*
字符赋值给整形
*/
int main(){
int p='a';
int q='A';
int e='0';
cout<<"a的ASCII码为: "<<p<<endl;//a的ASCII码为97
cout<<"A的ASCII码为: "<<q<<endl;//A的ASCII码为65
cout<<"0的ASCII码为: "<<e<<endl;//0的ASCII码为48
return 0;
}
运行结果
2) 整形赋值字符
#include<iostream>
using namespace std;
/*
整形赋值给字符型
*/
int main(){
char p=97;
char q=65;
char e=48;
cout<<"ASCII 97对应字符为: "<<p<<endl;//ASCII 97对应字符为a
cout<<"ASCII 65对应字符为: "<<q<<endl;//ASCII 65对应字符为A
cout<<"ASCII 48对应字符为: "<<e<<endl;//ASCII 48对应字符为0
return 0;
}
运行结果
3) 字符型算术运算
#include<iostream>
using namespace std;
/*
字符算术运算
char p='a';//a对应ASCII码为97
p++;//97+1=98 ,ASCII码98对应的字符是b
char q='a';//a对应ASCII码为97
q=q-32;//q=65,ASCII码65对应的字符是A
*/
int main(){
char p='a';
p++;
cout<<"p的值为:"<<p<<endl;//p的值+1后变成b
char q='a';
q=q-32;
cout<<"q的值为:"<<q<<endl;//p的值-32后变成A
return 0;
}
运行结果
5 拓展
1 为什么用强制类型转换
1) 无法进行自动类型转换
#include<iostream>
using namespace std;
/*
求2个数之和
int a=2147483647;
int b=10;
a + b;//a和b都是int,所以相加结果还是int
a + b=2147483657 已经超出int范围,所以计算错误
*/
int main(){
int a=2147483647;
int b=10;
long long c= a + b;//a+b超范围计算错误,赋值给c
cout<<c<<endl;//无法输出c的正确结果2147483657
return 0;
}
运行结果
可以通过强制类型转换解决此问题
long long c= (long long ) a + b;//把a的类型从int转换成long long
2) 不转换超出类型范围
int的使用4个字节表示二进制,最大可以表示2147483647的整数,如果实际计算过程中超过2147483647,需要使用更大数据访问的long long表示整数
2 ASCII码表
作者:newcode 更多资源请关注纽扣编程微信公众号
从事机器人比赛、机器人等级考试、少儿scratch编程、信息学奥赛等研究学习