1. 整型提升
整型提升是C程序设计语言中的一项规定:在表达式计算时,各种整形首先要提升为int类型,如果int类型不足以表示则要提升为unsigned int类型;然后执行表达式的运算。
2. 整形提升的意义
表达式的整型运算要在CPU的相应运算器件内执行,CPU内整型运算器(ALU)的操作数的字节长度 ,一般就是int的字节长度,同时也是CPU的通用寄存器的长度。
因此,即使两个char类型的相加,在CPU执行时实际上也要先转换为CPU内整型操作数的标准长度。
通用CPU(general-purpose CPU)是难以直接实现两个8比特字节直接相加运算(虽然机器指令中可能有这种字节相加指令)。所以,表达式中各种长度可能小于int长度的整型值,都必须先转换为int或unsigned int,然后才能送入CPU去执行运算。
在表达式进行计算时,char类型或者各种长度小于int长度的整型值,都要转换为int类型的整型,然后执行运算,进行截断,在进行最后的处理。
3. 整形提升的规则
(1)Signed 类型
整形提升是按照变量的数据类型的符号位进行提升的
高位补充符号位,负数高位补充1
高位补充符号位,负数高位补充1
(2)无符号类型(unsigned)
无符号整形提升,高位全补0
4.实例介绍
实例1
#include <stdio.h>
int main()
{
char a = 3;
char b = 127;
char c = a + b;
printf("%d\n", c);
return 0;
}
结果为
为什么c的值等于-126呢?
a=3,3是一个整形,4个字节占32个bit位
00000000 00000000 00000000 00000011 //3的二进制原码
而char类型只能存储1个字节
00000011 —a
b=127,也是一个整形
00000000 00000000 00000000 01111111 // 127的二进制原码
而char类型只能存储1个字节
01111111 —b
那么表达式a和b是如何相加的呢?
a,b进行表达式运算时进行整型提升
00000000 00000000 00000000 00000011 —a
00000000 00000000 00000000 01111111 —b
a,b这时变成整形,直接进行相加。
00000000 00000000 00000000 10000010 —c
但是c是char类型,只能存1个字节,必须进行截断处理
10000010 ----c
最后c要打印成%d,整形的形式
char类型的c再次进行整形提升,此时的结果为(内存中存储的是补码)
11111111 11111111 11111111 10000010 —c的补码
11111111 11111111 11111111 10000001 —c的反码
10000000 00000000 00000000 01111110 —c的原码
原码转换为十进制为 -126
实例2
#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;
}
结果为
经过上边整形案例的解释,简单说明
第一个if语句条件中的进行了比较的运算,a要进行整形提升,结果并不等于0xb6
b同理,c的类型本身就为int 类型,故c的结果不变。
所以最后打印的是c。
谢谢欣赏!!!