为什么要进行整形提升?
表达式的相应的整型运算要在CPU相关的运算器件内执行,CPU中的整型运算器的操作数的字节长一般就是int的字节长度,因此通过CPU是很难实现其他比特位字节的相加运算,所以,表达式中各种长度小于int的整型值都必须先转换成int或unsigned int,然后再送入CPU进行运算。
例子:
char a, b, c;
.....
c = a + b;
b和c的值会被提升为普通整形,然后再进行加法运算。
加法运算完成后,会根据c的类型进行截断,然后存储于a中。
如何进行整形提升?
整形提升是按照变量的数据类型的符号位来提升的
//正数的整形提升
char c1 = 5
变量c1的二进制位只有8个比特位:
补码:0000 1011
char 默认为有符号的char
所以整形提升的时候,高位补充符号位,即1
0000 0000 0000 1011
//负数的整形提升
char c1 = -5
变量c1的二进制位只有8个比特位:
补码:1111 1011
char 默认为有符号的char
所以整形提升的时候,高位补充符号位,即1
1111 1111 1111 1011
注:无符号的整形提升,高位补0即可
上面直接讲规则太过于枯燥,下面就举几个例子来试试水:
实例1:
int main()
{
char a = 0xb6; //0000 0000 0000 0000 1011 0110
short b = 0xb600; //0000 0000 1011 0110 0000 0000
int c = 0xb6000000; //1011 0110 0000 0000 0000 0000
if (a == 0xb6)
printf("a");
if (b == 0xb600)
printf("b");
if (c == 0xb6000000)
printf("c");
return 0;
}
实例1中的a,b要进行整形提升,但是c不需要整形提升 a,b整形提升之后,变成了负数,所以表达式
a==0xb6 , b==0xb600 的结果是假,但是c不发生整形提升,则表达式 c==0xb6000000 的结果是真.
所程序输出的结果是: c
以a为例子:
实例2:
int main()
{
char c = 1;
printf("%u\n", sizeof(c));
printf("%u\n", sizeof(+c));
printf("%u\n", sizeof(-c));
return 0;
}
实例2中的,c只要参与表达式运算,就会发生整形提升,表达式 +c ,就会发生提升,所以 sizeof(+c) 是4个字节。表达式 -c 也会发生整形提升,所以 sizeof(-c) 是4个字节,但是 sizeof(c) ,就是1个字节。