类似这种自动的数据类型转化被称作隐式类型强制转换 (implicit type coercion)。隐式类型强制转换会造成意外。
仍然是上期使用过的例子,隐式类型强制转换造成的结果出现误差。
为了避免出现意外,C++提供了明式类型转换,允许程序员通过使用类型转换操作 (cast operator) 主动转换数据的类型。
类型转换操作也可直接称为类型转换 (type conversion/type casting)。
类型转换有两种格式:
static_cast (表达式)
数据类型(表达式)
static_cast形式会更加稳定。
两种casting形式都可以得到同样的结果
再来看之前那个5除以2再加1.5的例子。
为什么结果是一样的?
因为先算括号内的,先5除以2,又根据除号两边都是整数,所以得到的结果是整数的,得到的结果再进行的casting,所以是把整数结果2转化成了double形式,就是2.0。
正确的思路应该是先把5和2这两个中的至少一个整数转化成了浮点数,再进行除法。
使用类型转换把浮点数转换成整数时,小数点后的部分会被之间扔掉,不会进行四舍五入等操作。
11除以3等于3.6666循环
目前要注意一点,小数点后只有0的浮点数的默认输出形式会省略小数点和小数点后的0,后面某期会讲怎么告诉计算机浮点数的输出格式,比如保留小数点后几位。
类型转换同样可是存在于char和int之间,根据 ASCII 的顺序位置进行转换。
由上图可知,E(大写)是第69位。
以下是我没有权威书本参考的胡乱猜测!!!
bool 转 int:
首先我们知道 true 的是1,false 的是0,所以 bool 转 int 的情况下,所有的 true 都转换成1,false 都转换成0。
甚至能参与运算,虽然不知道什么情况会用上。
Ev的阴间用法01
int 转 bool:
Ev的阴间用法02
由上图猜测,只有1和0能正常转换,其他整数一律转换成 true,也就是1。依旧是不知道有什么逻辑的用法。
int 转 char:
ASCII 除了0到127,后来还进行了一次扩展,有了128到255的字符。
注意加 system("chcp 437>>null");
关于超出255的整数怎么转换成 char,我在晚上查的是需要换算的方法。
简单地说就是需要先把那个整数换成16进制,再舍弃高位字节保留低位字节,再把低位部分根据ASCII找到对应的char。
由于我是个懒人,不爱转换,太麻烦了!虽然不是我换算,所以我找到了另一个思路。
首先char是个只有4个字节的数据类型,4个字节最大就是255,用整数除以255得到的余数再对应 ASCII 就是对应的char。
用代码验证了一下,确实没问题。(夸我)
float/double 转 char:
69是E是对的,可是为什么70也是E啊?70应该是F,可为什么71又是F?等等!为什么会有71.1?不应该停在71了吗?
然后我尝试在d += 0.1的0.1后面加了个f:
一切恢复正常。是我大意了,计算机在处理浮点数上面总是很让我头疼。
简单的查了一下这个f和加这个f的意义,还是没很明白,反正就有说f就是float,加f就表示是float类型,不然会预设为double类型。我加f纯属是在隔壁写C#脚本的时候习惯的。
总之,我推测在浮点数转 char 上,会隐式类型强制转换把浮点数转换成整数再转换成char类型。