我们先来看看下面几个程序的运行结果:
我们知道,a>b是关系表达式。在运算的时候,必须保证类型是一致的。
我们的C/C++是强类型语言。
如果是a=b
如果是a<b或者a>b
编译器默认类型转换
我们分析上图,竖着的3个箭头都是往上指向的!!!
横向的箭头表示的意思是:
当代码上有float类型的变量参与运算的时候,编译器都是默认先把float转为double,为了提高运算过程中的精度。
当char类型或者short类型的变量在参与运算的时候,编译器都会默认先把这2个类型的变量转成int类型参与运算,因为整型int存储的数据量更大,所以在运算的过程中,精度更高。
横向的意思是:看到float,char,short就转,没有什么条件!
竖向的意思是:当2个竖向方向上的类型参与运算,下面的类型默认转成上面的类型。 比如说,一个int和一个long参与运算,int转为long。
所以,我们来分析下面代码:
a是int,b是short,他们两个在参与运算的时候,a=-1,b从short转为int,b=1,所以a<b
我们继续看:
现在a是int,b是unsigned int,所以a转成unsigned int,a的二进制就是32个1,全部当作数值进行运算,42.9亿!所以a>b
我们继续看下面代码:
b的unsigned int转为double,b=1,a=-1,b>a
类型转换问题
我们举个例子:
大内存的变量存不进小内存的变量!!!
a是有符号的short类型,2个字节大小:
b是有符号的char类型。1个字节大小。b=a,把a的低16字节赋给b。
然后因为是有符号,所以1111 1111是负数。
取反+1,就是负多少,所以b=-1
我们看下面代码:
b是无符号的char,8个1全部是当作数值来运算了,所以b=255
我们看下面代码:
现在b=0了,因为a的低16位都是0
我们看下面代码:
把浮点数赋给整数,就是把浮点数的整数部分保留下来!