zoukankan      html  css  js  c++  java
  • 运算时的数据类型提升

    今天来分析测试一下这个很多人迷糊的地方,因为有些老师在这个地方讲得有待商榷。

    一种常见说法是:无符号和有符号数进行运算时,类型被提升为无符号类型。

    这也是我当初听老师讲课时的说法。

    test1:

    1     signed int ch=-10;
    2     unsigned int ch1=5;
    3     if(ch-ch1>0)
    4         printf("ch-ch1>0
    ");
    5     if(ch-ch1<0)
    6         printf("ch-ch1<0
    ");

    ch类型提升为unsigned int,-10的二进制补码是个很大的正整数,减去5大于0,所以输出

     printf("ch-ch1>0
    ");
    这里并没有什么特殊,但是,随着代码量的累计,我们发现了另外一个问题:
    test2:
    1     signed char ch=-10;
    2     unsigned char ch1=5;
    3     if(ch-ch1>0)
    4         printf("ch-ch1>0
    ");
    5     if(ch-ch1<0)
    6         printf("ch-ch1<0
    ");

     这里就出现疑惑了,不是应该提升成为无符号的吗?那么ch应该减去5应该还是大于0的呀?

    其实,是因为char会被提升成int,这里无符号char和有符号的都被提升成int了,所以输出是这样。

    那么,到底应该如何分辨呢?

    NOTE:

    类型提升负责把小整数转化成大整数类型。对于bool,char,signed cahr,unsigned char,short,unsigned short等类型,只要他们的值都可能存在int中,他们就会提升成int,否则提升成unsigned int 类型。布尔值 false提升成0,true提升成1.

    在运算的时候,类型一定是相同的,如果不同,就会有隐式或者显式的类型转换。

    而首先进行的是类型提升。

    这里有一段很长的话出自c++ primer,就不列出了,但我把那一段话概括了一下。

    summary:

    运算对象的类型在做运算时会被提升成一样的类型,不管之前类型是否相同,这种提升向着类型的模更大的转化。

    eg:

    ch 和ch1为char和uchar,在运算时首先提升为int,都是int类型比较就不存在类型提升问题,数学是如何计算机就如何计算;

    ch和ch1为int和uint,在运算时已经是整形,但存在无符号和有符号之分,所以类型提升为无符号(模更大)。

  • 相关阅读:
    错误论:错误是人类实践结果的一种状态,是实践的一个中间环节
    逻辑思维
    正确与错误、真理与谬误
    正确的判断,来自于错误的判断
    PHP+MySQL实现对一段时间内每天数据统计优化操作实例
    centos linux ip地址无法连接数据库,ssh登录服务器时必须使用22端口
    如何更改linux文件目录拥有者及用户组
    navicat ssh通道受限问题处理
    Navicat for MySQL 使用SSH方式链接远程数据库(二)
    Navicat for MySQL 使用SSH方式链接远程数据库
  • 原文地址:https://www.cnblogs.com/yangguang-it/p/6367671.html
Copyright © 2011-2022 走看看