跳到主要内容

类型转换

强制类型转换

隐式类型转换

隐式类型转换即编译器内自动发生的类型转换。

赋值时

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即真

运算时

整型提升

charbool 是无法直接运算的,都是先转换成int再计算的

  • char参与运算,将ASCII码转换成int再运算
    char a='A';
    cout<<a+32;//输出97

    a是char,在计算时计算的是ASCII码,会转换成int再计算,计算结果也是int类型的了

  • bool参与运算时,true 转换成1,false 转换成0
    bool a=2>1;
    bool b=3>1;
    cout<<a+b;//输出2

    true + 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

可见在写数字时也是在悄悄发生类型转换的,这都是编译器帮我们做的