整型提升的意义:
CPU内整型运算器(ALU)的操作数的字节长度一般是int的字节长度,同时也是CPU的通用寄存器的长度。
因此,表达式中各种长度小于int的类型相加,在送入CPU执行时,都要先转换为int或unsigned。
整型提升的规则:(1)若是有符号数,则前面补符号位。(2)若是无符号数,则前面补0。
int main()
{
//计算机中二进制存储都是补码
//char = 8字节;short = 2 / 4字节;int = 32 / 64字节
char a = 3;
//a的二进制:00000011
char b = 127;
//b的二进制:01111111
char c = a + b;
//求表达式长度会先转换为int型32字节
//a + b = 00000000000000000000000000000011 +
// 00000000000000000000000001111111
// = 00000000000000000000000010000010
//c的二进制:100000010
printf("%d\n", c);//结果为-126
//以整型的形式输出,也会整型提升
// char c = 00000000000000000000000010000010
// int c = 11111111111111111111111110000010(补码)
// int c = 11111111111111111111111110000001(反码)
// int c = 10000000000000000000000001111101(源码) = -126
return 0;
}
寻常算术转换:
如果某个操作符的各个操作数属于不同类型,那么除非其中一个数转换为另一个操作数的类型,否则操作无法进行。
操作符类型优先转换顺序:
int < unsigned int < long int < unsigned long int < float < double < long double