• c++有符号类型与无符号类型之间的类型强制转换


    首先应知道的类型转换规则

    1.计算机采用补码形式存储数值,即内存里的二进制数据是所表示数的补码形式(!!!核心知识点)

    2.整数的反码是本身,负数的反码是符号位不变,数据位按位取反

    3.整数的补码是本身,负数的补码是反码+1

    4.字面常量的类型转换,该字面常量会被当成unsigned 无符号类型对待,如static_cast<int>(0xb0) 将被转换成 176

    unsigned char uch= 0xB0;

    char ch = 0xB0;

    std::cout<<std::hex;

    std::cout<<"uch:"<<static_cast<unsigned int>(uch)<<std::endl;

    std::cout<<"to uint ch:"<<static_cast<unsigned int>(ch)<<std::endl;

    std::cout<<"to int ch:"<<static_cast<int>(ch)<<std::endl;

    std::cout<<"int ch:"<<static_cast<int>(static_cast<unsigned char>(ch))<<std::endl;

    std::cout<<std::dec;

    上面的程序输出分别是:

    uch:b0

    to uint ch:ffffffb0

    to int ch:-80

    int ch:b0

    物理内存二进制保存的到底是什么?

    对char类型而言

    -80  : 1101,0000 -------------->unsigned char :0xb0    1011,0000(这是实际物理内存里的二进制,而不是1101,0000)  。 这就是因为计算机物理内存是采用数值对应的补码来存储的。

    这里-80对于char类型来说它的原码二进制是1101,0000对就的补码是1011,0000

    所以这里如果对char ch这个变量ch,使用强制类型转换成int或unsigned int那么实际是对物理内存里的二进制值进行的操作。

    即:1011,0000-----(第1步因为是char类型所以-80先转成泌表示,符号位与数据位分离多余的位用0填上)----->1000,0000|0000,0000|0000,0000|0101,0000----(该值对应的内存值即它的补码是)1111,1111|1111,1111|1111,1111|1011,0000;它所对应的16进制值为0xffffffb0

    1111,1111|1111,1111|1111,1111|1011,0000 这个值即是int num=-80,变量num的物理内存里存储的二进制。

    -----------------------------------------------------------------------------
    交流QQ号:1175372067
    电话:18551717618(同微信)
    元几科技.软件3部
    迈开步伐去探索
    南京元几科技有限公司
    元几社区: https://www.cnblogs.com/colin-vio
    元几官网: http://www.yuanji.tech
    -----------------------------------------------------------------------------
  • 相关阅读:
    C语言课程设计 学生信息管理系统 (简单版)
    Windows 常用Cmd命令行 (持续更新...)
    C++课程设计 通讯录管理系统 原码及解析
    C++ Error 个人笔记(live)
    sql查询当天数据
    web.xml中load-on-startup标签的含义
    @Repository、@Service、@Controller 和 @Component
    SQL Server JDBC驱动中sqljdbc和sqljdbc4区别
    windows下设置/删除Tomcat的开机自启动
    【Python技巧系列】条件语句一行实现
  • 原文地址:https://www.cnblogs.com/colin-vio/p/14990702.html
Copyright © 2020-2023  润新知