当前位置:网站首页>一文让你快速了解隐式类型转换【整型提升】!

一文让你快速了解隐式类型转换【整型提升】!

2022-08-09 21:51:00 一个想打拳的程序员

0.隐式类型转换[整型提升]

C的整型算术运算总是至少以缺省整型的精度来进行的。为了获得这个精度,表达式中的字符和短整型操作数在使用之前被转换为普通整型,这种转换称为整形提升。简单来说就是,少于4个字节的类型运算时会自动根据某些规则转成int或者unsigned int进行运算。

char a,b,c;
a = b + c;
//在进行b+c运算时,因为b和c都为char类型,一个字节,
//所以b和c都会提升为普通整型,然后再执行加法运算。
//加法运算完成之后,结果将被截断(从后往前截取4个bit位),然后再存储于a中。

1.如何进行整形提升呢?

整形的提升是按照变量的数据类型的符号位来提升的。

1.1 负数的整形提升【高位补符号位】

char c = -1:
//数据在内存中是以补码的形式存在的!

在这里插入图片描述

变量c的二进制位(补码)中只有8个bit位:11111111,因为char为有符号的char ,所以在整形提升的时候,高位补充符号位,补充1,经过整形提升后的结果位11111111111111111111111111111111.
在这里插入图片描述

1.2 正数的整形提升【高位补符号位】

char c = 1;

在这里插入图片描述

变量c的二进制位(补码)中只有8个bit位:00000001,因为char为有符号的char ,所以在整形提升的时候,高位补充符号位,补充0,经过整形提升后的结果位00000000000000000000000000000001.
在这里插入图片描述

1.3无符号整形提升,高位补0

unsigned char c = -1;

在这里插入图片描述
变量c的二进制位(补码)中只有8个bit位:11111111,因为char为无符号的char ,所以在整形提升的时候,高位补充0,经过整形提升后的结果位00000000000000000000000011111111.
在这里插入图片描述

2 整形提升的例子

2.1 例1

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

这个程序的结果是什么呢!很明显是:c
在这里插入图片描述
因为a、b要进行整型提升,但是c不需要整型提升。

2.2 例2

int main()
{
    
    char c = 1;
    printf("%u\n",sizeof(c)); //1
    printf("%u\n",sizeof(+c));//4
    printf("%u\n",sizeof(-c));//4
    return 0;
}

c只要参加表达式的运算,就会发生整形提升,所以只有sizeof(c)为1个字节,其他发生整形提升后,变成了4个字节。

3. 结语

兄弟们,记住了!如果觉得写的不错,来个一键三连呗!!!!!!!!!!!!!!!
在这里插入图片描述

原网站

版权声明
本文为[一个想打拳的程序员]所创,转载请带上原文链接,感谢
https://blog.csdn.net/hero_jy/article/details/126248873