类型转换之整型提升和对sizeof关键字的认识

1、隐式类型转换

C的整型算术运算总是至少以缺省整型类型的精度来进行的,为了获得这个精度,表达式中的字符和短整型操作数在使用前被转换位普通整型,这种转换就称为整型提升

  1. 概念:
    C语言之父的著作 K&R 中关于整型提升(integral promotion)的定义为:
    “A character, a short integer, or an integer bit-field, all either signed or not, or an object of enumeration type, may be used in an expression wherever an integer maybe used. If an int can represent all the values of the original type, then the value is converted to int; otherwise the value is converted to unsigned int. This process is called integral promotion.”
    归纳总结为两个原则如下:
    A: 一个表达式中凡是可以使用整型的地方,都可以使用char、short int 或者整型位域(这几个基本类型无论是否带符号都可)的变量,以及枚举类型的对象。
    B: 如果A中的变量的原始类型的所有值都可以被int表示(没有造成值的丢失,就比如这种unsigned short提升为int的情况),那么原值被转换为int; 否则的话,转为unsigned int型。

  2. 意义:通用CPU是难以实现两个8比特字节直接相加运算,因为CPU内部的ALU操作数的字节长度就是int的字节长度,所以表达式中各种长度可能小于int长度的整型值,都必须转换为int或unsigned int,然后才送入CPU去执行运算。

  3. 详细过程
    整型提升是按照变量的数据类型的符号位来提升的

  • 负数的整型提升
    char c1=-1;
    c1是char型,在计算机补码表示后占八个比特位:1111 1111
    因为char是有符号的,所以整型提升的时候高位补充符号位,即为1
    提升后的结果是 1111 1111 1111 1111 1111 1111 1111 1111
    输出后结果截取后八位。

  • 正数的整型提升
    char c1 = 1;
    c2默认为有符号的char型,计算机中补码表示为:0000 0001
    整型提升后高位补充符号位,即0,提升后结果是:0000 0000 0000 0000 0000 0000 0000 0001

  • 无符号整型最高位补0
    实例1:

int main()
{
    char a = 0xb6;
    char b = 0xb600;
    int c= 0xb6000000;
    if(a==0xb6)
        printf("a");
    if(b==0xb600)
        printf("b");
    if(c==0xb6000000)
        printf("c");
    return 0;
}

a,b分别整型提升后变成了ff ff ff b6、ff ff bb 00,变成了负数,所以前面两个if的表达式都为假,但是c不必发生整型提升,表达式的结果是真,所以输出c。
实例2:

int main()
{
    char c=1;
    char c=4;
    printf("%u\n",sizeof(c));   //1
    printf("%u\n",sizeof(+c));  //4
    printf("%u\n",sizeof(!c));  //1
    printf("%u\n",sizeof(-c));  //4
    printf("%u\n",sizeof(--c)); //1
    printf("%u\n",sizeof(c+b)); //4
    return 0;
}
  • 这里的c参与了表达式的运算,就会发生整型提升,表达式+c和-c都会由一个字节提升为4个,但是sizeof ( c )就是一个字节。
  • 还要注意一点,自增和自减都是针对变量的特殊运算符,所以++c中的c是变量,而我们的整形提升是发生在表达式中的,所以++c仍然是一个字节。
发布了52 篇原创文章 · 获赞 6 · 访问量 1456

猜你喜欢

转载自blog.csdn.net/qq_40488936/article/details/103596508