zoukankan      html  css  js  c++  java
  • 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
    -----------------------------------------------------------------------------
  • 相关阅读:
    【AtCoder Regular Contest 080E】Young Maids [堆][线段树]
    【AtCoder Grand Contest 007E】Shik and Travel [Dfs][二分答案]
    【Codeforces858F】Wizard's Tour [构造]
    【AtCoder Grand Contest 001F】Wide Swap [线段树][拓扑]
    【AtCoder Grand Contest 012C】Tautonym Puzzle [构造]
    【Foreign】动态规划 [分治][DP]
    【BZOJ2683】简单题 [分治][树状数组]
    【BZOJ4237】稻草人 [分治][单调栈]
    【BZOJ3745】Norma [分治]
    【BZOJ4552】【HEOI2016】排序 [二分答案][线段树]
  • 原文地址:https://www.cnblogs.com/colin-vio/p/14990702.html
Copyright © 2011-2022 走看看