类型转换

这今天有朋友面试遇到一个题是这样的

int main()
{
    unsigned int a = 6;
    int b = -20;
    a + b > 6? puts(">6"):puts("<=6");
    return 0;
}

  问你说出结果

如果你不了解隐式类型转换,你很大可能说 <= 6

结果是 .>6

哎,我就深入理解类型转换吧

所谓类型转换就是一种数据类型转换成为另一种数据类型

在一个算术表达式中,如果出现两个不同数据类型,就会先进性类型转换,在计算表达式的值

比如

cout << 34 + 21.45 + 'a' << endl;

34 是int,21.45是double,'a'是char类型。
运算的过程如下 34会先转换成double类型 34.00,再完成34.00+21.45的
运算,得到当前结果 55.45 ,然后将 'a' 转换成double类型,97.00
再计算 55.45 + 97.00 得到最终结果 152.45

而类型转换分为隐式类型转换和显示类型转换。
c++中类型转换发生在,算术表达式计算,函数参数传递,函数返回值及赋值语句中

我们先谈谈隐式类型转换吧
下面四种情况会发生隐式类型转换
定义:
c++会自动对参与运算的数据类型进行转换,不需要人参与叫隐式类型转换

1.同一算术表达式中出现了多种数据类型。
转换规则是:
尽可能避免精度损失,因此窄数据(占用内存小的类型)向宽数据(占用内存大的类型)转换具体如下

其中整数是从小整数转换为大整数
short,unsigned short;
bool ,char,signed char,unsigned char
只要表达式出现这些,如果对应的变量可以用int来存,都会首先转换为int
如果超出int就提升为unsigned int

2.变量赋值时也会出现隐式类型转换
例如
int a = 2;
float b = 3.4;
double c = 2.2;
b = a;将a转换为float 2.0 再赋值给b
a = c; 将c的值2.2转换为int 2 再赋值给a

上面出现了两种情况
2.1 b = a 窄数据(占用内存小的类型)向宽数据(占用内存大的类型)转换

2.2 a = c 宽数据向窄数据转换
显然第二种会损失精度,是不安全的。
c++采取截取方法进行 宽数据向窄数据转换

a = c 会截取c的int部分 2 赋值给a

3.函数调用过程中,如果实参与形参类型不符,则把实参类型转换为形参类型

4.函数返回时,如果返回表达式的值和函数声明返回类型不符,则
把表达式类型转换为函数声明返回的类型,例如

float Min(int a,int b)
{
return a < b? a:b;
}

会把int转换为float 再返回给Min函数

然后显示类型转换:

定义:

可以人为地强制转换

(type) var;

或 type (var)

 然后我们再说说刚开始那题,为啥是 > 6;

int < unsigned 所以发生隐式类型转换。但是呢-20这尼玛就溢出了呀

你输出 a + b的结果是 4294967282 为什么是这么多?你需要了解下面这两个就够了

关于整数溢出的规则以及 unsigned的范围 就知道了

自行百度吧

原文地址:https://www.cnblogs.com/mch5201314/p/11688319.html