• char类型细节


    这里讲的是在c++环境中,char表示的长度为8bit。

    首先char是有符号的字符类型;范围是-128~127之间;这里讨论下它的溢出,int到char,char到int之间过程;涉及计算机存储问题补码存储。

    第一:计算存储以补码存储原因是减法计算可以变成补码加法计算(数以8bit为例)

    例如:1-2=-1

    1的补码是00000001;2的补码是00000010;-1的补码是11111111;减法操作先对2进行取反形成-2的补码即为11111110;接着相加如下

      00000001

    +11111110

    ———————

      11111111

    由此得到了-1。

    想象下要是原码这样,则就是如下:

      00000001

    +10000010

     ———————

      10000011显然是为-3不是-1则不对,故而直接存储原码则必须增加一个减法操作。

    第二:关于10000000的补码

    通过符号位保持不变,其余取反后,接着整个加1得到值为:1|00000000,显然截取后为00000000也就是和0的补码一致,按理应该是0值,也就是说0值对应着2个补码;可是为了是资源充分利用,系统规定了10000000的值表示为-128而不是表示0。也就是让10000000的补码为10000000而不是00000000。

    第三:溢出问题

    1:int到char的截断问题

    比如char c=128;//产生溢出值的范围出错

    这个128超出了char范围自动用是int来存储的,被char类型截断后为10000000,记住我们计算机存储方式是补码存储,则就是说它的原码才是我们显示的值,用刚第二说的,则对应着-128;同理如c=129则补码存储为10000001则相应原码是11111111表示-127(注意补码的补码就是原码)。

    2:char到int的转换问题

    例如:char c=127;//补码存储则为全1

    int i=c+1;

    结果是128;

    分析:先将c转换为int类型了故而char看不到溢出效果;

    3:char到int的溢出问题

    char c=256;//溢出了整个字节了出错==本质和1情况一样原理

    int i=c;

    显示为0;

  • 相关阅读:
    使用beanUtils操纵javabean
    反射
    JDK5.0新特性(静态导入、自动装箱/拆箱、增强for循环、可变参数、枚举、泛形)
    Junit测试框架
    Eclipse常用快捷键
    Linux最全基础指令
    log file sync等待事件
    数据库要不要部署在docker容器内?
    MySQL启动报错-The server quit without updating PID file[FAILED]mysql/mysql.pid).
    MySQL数据库启动异常-[ERROR] [MY-011971]
  • 原文地址:https://www.cnblogs.com/miner007/p/3678134.html
Copyright © 2020-2023  润新知