• 运算时的数据类型提升


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

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

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

    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,在运算时已经是整形,但存在无符号和有符号之分,所以类型提升为无符号(模更大)。

  • 相关阅读:
    java:数组操作工具类 java.util.Arrays包 主要方法详解
    java:接口特性 接口与抽象类/普通类的区别
    mybatis教程:入门>>精通>>实战
    Java :内部类基础详解
    Java swing: 实现ActionListener监听器的三种途径
    Java:final、static关键字 详解+两者结合使用
    Java:双括号初始化 /匿名内部类初始化法
    Java:静态内部类的使用目的、使用限制、与非静态内部类的对比
    域名解析>>"记录类型" 说明
    Java:接口继承接口 (多继承机制)
  • 原文地址:https://www.cnblogs.com/yangguang-it/p/6367671.html
Copyright © 2020-2023  润新知