小古银的官方网站(完整教程):http://www.xiaoguyin.com/
C++入门教程视频:https://www.bilibili.com/video/av20868986/
目录
隐式类型转换
当我们使用int a = 12.7f;
时,赋值是会成功的。因为当不同类型之间赋值时,编译器在编译的时候会进行隐式类型转换,有时也会有警告提醒你。当有警告提醒你的时候就要注意了,拿转换后的值继续执行代码,可能会有你意想不到的错误。
静态类型转换
当我们使用int a = 12.7f;
或者int a = 500u;
等情况,编译器编译时可能会警告提示。秉承不能无视警告的原则,当你知道这个转换的确是安全的时候,就可以使用显式类型转换。显式类型转换在转换之前会进行类型安全检测。
C++的显式类型转换有四种,现在只讲一种最常用的:static_cast
,它的用法如下:
static_cast<目标类型>(要转换的值或者变量)
当编译器知道转换行为是安全的时候就可以使用。如:int a = static_cast<int>(12.7f);
,将float
值转换成int
值,此时,将舍弃所有小数位,12.7f
变成12
,然后赋值给变量a
。如果编译器认为不能转换,则编译时报错。
注意:
上面说到的小数转换:小数转换成整数时,将舍弃所有小数位,如12.7
转换成12
。
基础示例
还有下面要说的,我直接举例,以下例子认真看就懂了,我就不多说了:
#include <iostream> // std::cout std::endl
#include <bitset> // std::bitset
int main(void)
{
// 4字节的int转换成2字节的short
int num1 = 0b1100'1100'1100;
std::cout << num1 << std::endl;
std::cout << static_cast<short>(num1) << std::endl;
std::cout << std::bitset<32>(num1) << std::endl;
std::cout << std::bitset<32>(static_cast<short>(num1)) << std::endl << std::endl;
// 4字节的int转换成2字节的short
int num2 = 0b1100'1100'1100'1100'1100'1100;
std::cout << num2 << std::endl;
std::cout << static_cast<short>(num2) << std::endl;
std::cout << std::bitset<32>(num2) << std::endl;
std::cout << std::bitset<32>(static_cast<short>(num2)) << std::endl << std::endl;
// 有符号和无符号互转
int num3 = 100;
std::cout << num3 << std::endl;
std::cout << static_cast<unsigned int>(num3) << std::endl;
std::cout << std::bitset<32>(num3) << std::endl;
std::cout << std::bitset<32>(static_cast<short>(num3)) << std::endl << std::endl;
// 有符号和无符号互转
int num4 = -100;
std::cout << num4 << std::endl;
std::cout << static_cast<unsigned int>(num4) << std::endl;
std::cout << std::bitset<32>(num4) << std::endl;
std::cout << std::bitset<32>(static_cast<short>(num4)) << std::endl << std::endl;
return 0;
}
输出结果:
3276
3276
00000000000000000000110011001100
00000000000000000000110011001100
13421772
-13108
00000000110011001100110011001100
11111111111111111100110011001100
100
100
00000000000000000000000001100100
00000000000000000000000001100100
-100
4294967196
11111111111111111111111110011100
11111111111111111111111110011100
基础讲解
当int
变量保存的值在short
的范围内时,int
转换成short
是没有问题的;当int
变量保存的值大于short
的范围时,只有int
的低16位转换成short
,而高16位则被舍弃。因此,上面代码static_cast<short>(num2)
得到的结果是二进制的1100110011001100
,也就是十进制的
-13108
。至于上面的输出中,前面16位都是1,是因为转换后的结果是-13108
,然后用32位二进制表示-13108
就是这个样子,你可以尝试用之前讲解的方法,求出这个补码的原码看看结果。
所以,类型转换之前要想清楚而且不要无视警告。