C的整型算术运算总是至少以缺省整型类型的精度来进行的。
为了获得这个精度,表达式中字符和短整型操作数在使用之前被转换为普通整形,这种转换称为整型提升
整型提升的意义:
表达式的整形运算要在CPU相应运算器件内执行,CPU内整形运算器(ALU)的操作数的字节长度一般就是int的字节长度,同时也是CPU的通用寄存器的长度。
因此,即使两个char类型的相加,在CPU执行时实际上也要先转换为CPU内整形操作数的标准长度。
通用CPU是难以直接实现两个8bit字节直接相加运算(虽然机器指令中可能有这种字节相加指令)。所以,表达式中各种长度可能小于int长度的整型值,都必须先转换为int或unsigned int,然后才能送去CPU去执行运算。
如下例:char a=3 char b=127,相加之后结果为-126
int main() {
char a = 3;
//00000000 00000000 00000000 00000011
//00000011 - a
char b = 127;
//00000000 00000000 00000000 01111111
//01111111 - b
//a和b相加
//00000011
//01111111
//整形提升 根据符号位补
//00000000 00000000 00000000 00000011
//00000000 00000000 00000000 01111111
//00000000 00000000 00000000 10000010
//10000010 - c
//整型提升
//11111111 11111111 11111111 00000010 补码
//11111111 11111111 11111111 00000001 反码
//10000000 00000000 00000000 11111110 原码=-126
char c = a + b;
printf("%d\n", c);//-126
return 0;
}
?打印结果为1,4,1
int main() {
char c = 1;
printf("%u\n", sizeof(c));//1
printf("%u\n", sizeof(+c));//4
printf("%u\n", sizeof(!c));//1
return 0;
}
输出结果为c,因为a和b进行了整型提升?
int main() {
char a = 0xb6;
//1011 0110
short b = 0xb600;
int c = 0xb6000000;//本来就是整形
if (a==0xb6)
{
//整型提升 补1
printf("a");
}
if (b==0xb600)
{
printf("b");
}
if (c==0xb6000000)
{
printf("c");
}
return 0;
}
|