C++入门教程(二十五):隐式转换和静态转换

小古银的官方网站(完整教程):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就是这个样子,你可以尝试用之前讲解的方法,求出这个补码的原码看看结果。

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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值