• Index

隐式转换和静态转换

Reads: 28

隐式类型转换

当我们使用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就是这个样子,你可以尝试用之前讲解的方法,求出这个补码的原码看看结果。

所以,类型转换之前要想清楚而且不要无视警告


Comments

Make a comment

  • Index

WARNING: You are using an old browser that does not support HTML5. Please choose a modern browser (Chrome / Microsoft Edge / Firefox / Sarafi) to get a good experience.