c语言|C语言中的隐式类型转换

C语言的整型运算至少以缺省整型类型的精度来进行的。
在表达式中,字符和短整型操作数在使用之前被转换为普通整型,这种转换称为整型提升。
整型提升的意义:
表达式的整型运算要在CPU的相应运算器件内执行,CPU内整型运算器(ALU)的操作数的字节长度
一般就是int的字节长度,同时也是CPU的通用寄存器的长度。因此,即使两个char类型的相加,在CPU执行时实际上也要先转换为CPU内整型操作数的标准长度。
通用CPU(general-purpose CPU)是难以直接实现两个8比特字节直接相加运算(虽然机器指令
中可能有这种字节相加指令)。所以,表达式中各种长度可能小于int长度的整型值,都必须先转
换为int或unsigned int,然后才能送入CPU去执行运算。
例如:
char c1 = -1;
【c语言|C语言中的隐式类型转换】c1二进制补码中只有8个bit位,-1的二进制是1111 1111,因为是有符号数,所以在整型提升的过程中,高位补符号位,-1赋值给c1的时候,首先先提升成int型即1111 1111 1111 1111 1111 1111 1111 1111,然后赋值给c1,截断,只保留低八位。

char a = 0xb6; short b = 0xb600; int c = 0xb6000000; if(a==0xb6) printf("a"); if(b==0xb600) printf("b"); if(c==0xb6000000) printf("c");

上面这段代码是整型提升的一个很好的例子
a==0xb6,其中0xb6默认是整形高位为0省略了,实际上是0x000000b6,而a在进行比较的时候发生了整型提升变为0xffffffb6,所以二者不相等。同理b也一样。而c本身是int类型,不需要整型提升,所以最终结果为打印一个字符c。
char c = 1; printf("%u\n", sizeof(c)); printf("%u\n", sizeof(+c)); printf("%u\n", sizeof(++c));

分别输出1,4,1;c是char类型占用一个字节的大小,+c中的c参与表达式运算,发生整型提升,所以输出的是4,++c只是单独改变c的值,相当于c=c+1;最终还是char类型。
char c = -128; printf("c=%u",c);

最终输出的结果为4294967168;
原因是-128补码是1000 0000,char类型转换成无符号整型也需要整型提升,最高位补符号位
1111 1111 1111 1111 1111 1111 1000 0000,这个值对应的十进制下的值就是4294967168。

    推荐阅读