1. 隐式转换
C在以下四种类型中会进行隐式转换:
1. 算术运算符中,低类型转换为高类型
2. 赋值表达式中,右边的值自动隐式转换为左边变量的类型,并赋值
3. 函数调用参数传递,系统隐式将实参转换为形参的值
4. 函数有返回值,系统隐式返回表达式类型转换为返回值类型
2. 算术运算符隐式转换
C语言中算术运算符隐式转换:
低类型要转换为高类型计算!
(1)有符号的和无符号的计算,会优先转换为无符号类型:
例如:
unsigned int i=3;
cout << i*(-1);
答案是: -1转换为 unsigned int 2^32 +(-1) = 4294967295
4294967295 * 3 = 12884901885 出现溢出 转换为16 进制 0x2FFFFFFFD,由于unsigned int只能表示32位,因此结果是0xfffffffd,即4294967293。
(2)其他转换规则如下:
char , unsigned char , short , unsigned short , int , unsigned int , long , unsigned long , double
低级 高级
float 一律 要转换为 double类型
C++有符号类型和无符号类型转换规则:
1. 当我们给一个无符号类型赋一个超过其表示范围的负值时,其最后的结果是该负值与该无符号类型所能表示的数的总个数的和,如果所得结果还是一个不在此类型表示范围的负数,则将所得结果重复以上相加的过程,直到最后得到一个在其表示范围的数,此即为最后的结果
例如: unsigned char m = -258;
int n = m;
n的结果为 :-258 + 256 = -2;
-2 + 256 =254; 所以 n =254;
2. 当我们赋给一个无符号类型一个超出它表示范围的 正值 时,结果是将我们所赋的这个值对此无符号类型所能表示的数的总个数取模后的余数
例如: unsigned char j =258;
int k = j;
k的结果为 258%256 = 2
补:
1. short = signed short 等等
参考 : 1. https://blog.csdn.net/abnerwang2014/article/details/20656423
2. https://blog.csdn.net/qq_24373811/article/details/52922272