C语言中的整型提升

C语言中的整型提升

提到整型提升,可能刚学c语言的小伙伴们很头疼这个知识点吧,下面我就我的理解简单分析一下整型提升是怎么回事.
首先还是介绍一下整型提升的概念:
​ c的整型算术运算总是至少以缺省整型类型的精度来进行的. 为了获得这个精度,表达式中的字符和短整型操作数在使用之前被转换为普通整型,这种转换称为整型提升.
整型提升是按照变量的数据类型的符号位来进行提升的.
可能小伙伴们看到这个说明还是一头雾水,那么下面我通过一个具体的例子来说说整型提升到底是怎么回事.
(注意看我里面注释的说明哦)

int main()
{
    char a=3;
    //00000000 000000000 00000000 00000011     //3的16进制
    //00000011 -a   因为a是char类型的,所以a中只能放一个字节
    char b=127;
    //00000000 000000000 00000000 01111111
    //01111111
    char c=a+b;
    //a和b要相加的话首先被提升为普通整型,然后再执行加法运算
    //a发生整型提升后的结果:   
    //0 00000000 00000000 00000000 0000011  符号位为0,
    // 在0后面补全32位来进行提升
    //b发生整型提升后的结果:   
    //0 00000000 00000000 00000000 1111111
    //a+b=00000000 000000000 00000000 00000011 
    //   +00000000 000000000 00000000 01111111
    //   =00000000 000000000 00000000 10000010 
    //所以c=10000010 
    //因为内存中的数据都是以补码的形式存放在内存中的
    //且打印的是%d,就是以十进制形式打印,所以这里就会发生整型提升
    //c进行整型提升 1 11111111 11111111 11111111 0000010 (补码)
    //因为首位为1,所以符号位为1,在1后面补全32位来进行提升
    //        反码:1 11111111 11111111 11111111 0000001
    //        (反码等于补码减1)
   //         源码:1 00000000 00000000 00000000 1111110 
   //         (源码=反码的符号位不变,其他位取反)  
    printtf("%d\n",c);  //所以结果为-126  
    return 0;
}

仔细看完上面,是不是对整型提升有了一些更清楚的了解呢.下面来看看这个题

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不打印,原因是 ==号相当于发生算术运算,所以a和b发生了整型提升 那么a和b发生整型提升后的数值为多少呢?
下面我在来分析一下a发生整型提升的过程:
首先a=0xb6, 写成二进制就是:10110110
然后可以看出符号位为 1, 接着就是在1 的后面补齐1到32位,即:
1 11111111 11111111 11111111 0110110 (补码)
接着我们把补码转换为源码
1 11111111 11111111 11111111 0110101 (反码)
1 0000000 0000000 0000000 1001010 (源码)
所以a = 01001010; (取后面8个bit位,因为char类型只能放入一个字节),所以这里的a是不会打印的. 同理 你们可以自己去分析一下b.

分析了整型提升是怎么回事,那么到底什么时候会发生整型提升呢?相信很多人还是一头雾水.
所以记住这句话就行, 当char类型和short类型的数据,只要参与了表达式运算,那么就会发生整型提升
下面再来看个例子:


int main()
{
	char c=1;
	printf("%d\n", sizeof(c));
	printf("%d\n", sizeof(+c));
	printf("%d\n", sizeof(!c));
	return 0;
}

这里打印的结果为 1, 4, 1
为啥第二行打印的结果为4呢?
因为表达式+c中,c参与了表达式运算,发生了整型提升,所以它的大小就变成了4个字节.

看完后,如果对你有帮助记得关注下哦,有不懂的也可以在评论区说说.

上一篇:JVM的艺术-对象创建与内存分配机制深度剖析


下一篇:线性代数与MATLAB2