整形提升是为了获得这个精度,表达式中的字符和短整型操作数在使用之前被转换为普通整型,这种转换称为整型提升。
1、负数的整形提升
char a=-1;
//因为变量a的二进制位(补码)中只有8个比特位:11111111
//且char是有符号的char,所以整形提升时,需要补充符号位,即为1
//提升结果是11111111111111111111111111111111
2、正数整形提升
char b=1;
//b的二进制位(补码)只有8个比特位:00000001
/因为char是有符号的char
//所以提升的时候,最高位补充符号位,即为0;
//整形提升的结果是:00000000000000000000000000000001
3、无符号整形提升(高位补0)
unsigned char c=-1;
//c的二进制位(补码)只有8个比特位:11111111
//因为c是无符号的c,所以整形提升时,高位补充0
//整形提升的结果是:00000000000000000000000011111111
整形提升的例题
1
int main()
{
unsigned char a = 200;
//00000000000000000000000011001000 32个比特位的a的原反补码(正数的原反补相同)
//11001000 a的原反补码(a的类型是无符号类型,最高位1不是符号位)(char是1个字节,即8个比特位,所以从低位取8个比特位)
unsigned char b = 100;
//00000000000000000000000001100100(与上文一致)
//01100100
unsigned char c = 0;
//a+b相加时,需要a,b先整形提升
//00000000000000000000000011001000 a
//00000000000000000000000001100100 b
//00000000000000000000000100101100 a+b
//因为c是char类型,只有8个比特位
//0101100 c
c = a + b;
//0101100 c
printf("%d %d", a+b, c);
//c中的%d,先把c整形提升,c最前位是0,无符号位,补0
//00000000000000000000000000101100 这个为整形提升后c的补码,最高位为0,补码原码都一样
//00000000000000000000000000101100 c的原码,也就是打印出来的结果
//a+b的%d,因为已经32个比特位了,不需要整形提升了,且最高位为0,补码原码一样
//00000000000000000000000100101100 a+b的补码 (储存的)
//00000000000000000000000100101100 a+b的原码(打印出来的)
return 0;
}
2(short是2个字节,16个比特位)
int main()
{
int a = -1;
//10000000000000000000000000000001
//11111111111111111111111111111110
//11111111111111111111111111111111
unsigned short b = a;
//1111111111111111 b的原反补
printf("%d\n", b);
//00000000000000000111111111111111 整形提升,因为b是无符号短整型类型的,所以补0
printf("%u\n", b);
//00000000000000000111111111111111 整形提升,因为b是无符号短整型类型的,所以补0
return 0;
}
(这里的%d,%u有讲究,虽然这题没有发挥出来,如有兴趣,可以前往主页搜索%d与%u的细节)