类型转换
强制类型转换
隐式类型转换
隐式类型转换即编译器内自动发生的类型转换。
赋值时
int a='0'; //存的是48 char->int 由ASCII码决定
int b=3.99999;//存的是3 double->int 直接舍去小数
int c=true; //存的是1 bool->int true是1 flase是0
char d=65; //存的是'A' int->char 65对应的字母是A
bool e=123; //存的是true int->bool 非0即真
运算时
整型提升
char
和 bool
是无法直接运算的,都是先转换成int再计算的
- char参与运算,将ASCII码转换成int再运算
char a='A';
cout<<a+32;//输出97a是char,在计算时计算的是ASCII码,会转换成int再计算,计算结果也是int类型的了
- bool参与运算时,
true
转换成1,false
转换成0bool a=2>1;
bool b=3>1;
cout<<a+b;//输出2true + true
相当于1+1
整形和浮点运算=浮点
cout<<5/2.0<<endl;//输出2.5
cout<<5/2<<endl; //输出2
整数除整数是整除
cout<<5/2<<endl; //输出2
double a=5/2; //a里面也不会存2.5
其他
一些有趣的问题,不要求掌握
中文字符
ASCII就占1字节,最多表达256个信息,但是汉字有那么多,怎么存呢?
char a='中';
cout<<a<<endl;//没东西
cout<<a<<a;//输出:行
what?原来中文用的不是ASCII码,而是GB2312
- GB2312 全称是《信息交换用汉字编码字符集》
- 一个中文占2个字节
- 更多信息-百度百科
比如一个汉字“中”的二进制编码就是:11010110 11010000,占两个字节,我们把它分成两部分,每部分单独转换十进制,结果是214和208,然后做个实验。
char a=214;
char b=208;
cout<<a<<b<<endl;//输出:中
之前为什么输出“行”呢?因为行的编码就是11010110 11010110
int还是longlong
cout<<5<<endl;//5是什么类型?默认是int
cout<<2147483648<<endl;//int类型的话,这个数超过int了,结果还能输出
cout<<2147483647123<<endl;//这个也超了,也能输出,这是为什么
//sizeof() 可以检查占的内存是几字节
cout<<sizeof(5)<<endl;//4 可以理解 一个int占4字节
cout<<sizeof(2147483648)<<endl;//4?! 为什么
cout<<sizeof(2147483647123)<<endl;//8?! why?
//typeid().name() 可以查看类型名称简写 头文件#include<typeinfo>
cout<<typeid(5).name()<<endl;//i 表示int
cout<<typeid(int).name()<<endl;//i
cout<<typeid(2147483648).name()<<endl;//m 表示unsigned long
cout<<typeid(unsigned long).name()<<endl;//m
cout<<typeid(2147483647123).name()<<endl;//x long long
cout<<typeid(long long).name()<<endl;//x
可见在写数字时也是在悄悄发生类型转换的,这都是编译器帮我们做的