个人主页:Lei宝啊
愿所有美好如期而遇
什么是整型提升?
在C语言的整型算数运算总是至少以int类型来进行的,当表达式中有char,byte,short类型的操作数时,他们在被使用前需要被转换成int类型,这种转换我们称之为整型提升。
最后int类型的值赋值给short类型的s时会被截断,丢失一部分比特位。
为什么要整型提升?
这就涉及到CPU了,下面如果能够听懂就最好,听不懂也没关系,C语言学习阶段能够知道有整型提升和知道如何进行整型提升就已经很好了。
表达式的整型运算要在CPU相应的运算器内执行,而这个运算器的操作数的字节长度一般就是int类型的字节长度,也就是4个字节,这也是CPU通用寄存器的长度,由此,即使是两个char类型的变量相加也要先转换成CPU内整型操作数的标准长度。
就好比是一个模具,我们盛放数据的标准模具大小是4个字节,如果我们放比他小的数据进去,是不是不符合规范啊,所以我们先把他扩充到标准模具大小,再放进去就刚刚好了,大致是这么个意思。
如何进行整型提升?
整型提升是按照变量的数据类型的符号位来进行提升的:
#include <stdio.h>
int
main()
{
//00000001
char c1 = 1;
//11111111
char c2 = -1;
//0 0000001 --> 00000000 00000000 00000000 00000001
//1 1111111 --> 11111111 11111111 11111111 11111111
char c3 = c1 + c2;
return 0;
}
//额外小声哔哔两句,负数的补码可以通过正数的补码一步得出
//就是找到正数补码最右边的1,然后这个1右边不变,左边的二进制位全部取反
//举个例子
接下来我们看整形提升的例子:
#include <stdio.h>
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;
}
会是什么结果呢?我们先进行分析:
#include <stdio.h>
int
main()
{
char a = 0xb6;
short b = 0xb600;
int c = 0xb6000000;
//先看a十进制的大小,11 * 16 + 6 * 16 = 182
//同时a需要进行整型提升
// a : 10110110 --> 11111111 11111111 11111111 10110110
// 0xb6 : 00000000 00000000 00000000 10110110
if (a == 0xb6)
printf("a");
//先看b十进制的大小,46592
//同时b需要进行整型提升
// b : 10110110 00000000 --> 11111111 11111111 10110110 00000000
// 0xb600 : 00000000 00000000 10110110 00000000
if (b == 0xb600)
printf("b");
//int不会进行整型提升,所以就是0xb6000000
if (c == 0xb6000000)
printf("c");
return 0;
}
于是我们可以得出结果,只输出c。
值得说明的是,char,byte,short类型的操作数,只要参与运算,就会发生整型提升,示例: