一.什么是整形提升?
CPU内整形运算器的操作数的字节长度,一般是 int 类型的长度 。C的整数运算总是以整型类型的进度来进行的。为了获取这个精度,表达式中字符和短整型操作数在使用之前被转换为普通整形,这种转换称为整形提升。
二.怎么进行整形提升?
规则:整形提升是按照变量的数据类型的符号位来提升。
负数的整形提升
char c1 = -1;
变量c1的二进制补码中,只有8个比特位,即1111 1111。
怎么得到这个结果的?
-1 是整数,即 4个字节 32个比特位.
-1的原码:1000 0000 0000 0000 0000 0000 0000 0001
-1的反码:1111 1111 1111 1111 1111 1111 1111 1110
-1的补码:1111 1111 1111 1111 1111 1111 1111 1111
因为c1只有8个比特位,放不下一个整形(32个比特位),此时就会发生截断 ,只把最后面的8个比特位放进c1里。
c1的整形提升:c1是有符号char , 整形提升的时候 ,最高位补充符号位 1 。
即 1111 1111 1111 1111 1111 1111 1111 1111
正数的整形提升
char c2 = 1;
变量c2的二进制补码中,只有8个比特位,即0000 0001。
怎么得到这个结果的?
1 是整数,即 4个字节 32个比特位。因为是正数原码反码补码都是一样的。
1 的补码:0000 0000 0000 0000 0000 0000 0000 0001
因为c2只有8个比特位,放不下一个整形(32个比特位),此时就会发生截断 ,只把最后面的8个比特位放进c1里。
c1的整形提升:c1是有符号char , 整形提升的时候 ,最高位补充符号位 0 。
即 0000 0000 0000 0000 0000 0000 0000 0001
无符号数
无符号数整型提升,最高位补0。
三.整形提升的示例
int main()
{
char a = 5;
char b = 126;
char c = a + b;
printf("%d\\n", c);
return 0;
}
这个代码运行的结果是什么呢?
下面来分析:
5 是正数,原反补都一样。
5 的补码:0000 0000 0000 0000 0000 0000 0000 0101
然后截断最后8个比特位,a里存放 0000 0101。
126 的补码:0000 0000 0000 0000 0000 0000 0111 1110
截断最后8个比特位,b里存放 0111 1110。
在这个表达式中 c = a + b ,a 和 b 是达不到一个整形的大小,整形提升。
0000 0000 0000 0000 0000 0000 0000 0101
0000 0000 0000 0000 0000 0000 0111 1110
整型提升后执行运算。
结果 :0000 0000 0000 0000 0000 0000 1000 0011
运算完,截断,存放 1000 0011 。
最后打印的是 %d (打印整形),这个时候,又整形提升,这次最高位是 1 ,
整型提升的结果:1111 1111 1111 1111 1111 1111 1000 0011
还没完,这次得到的整形提升的结果是补码。
-1 得到 反码 :1111 1111 1111 1111 1111 1111 1000 0010
取反得到 原码:1000 0000 0000 0000 0000 0000 0111 1101
如果把这个补码放到程序员计算器里,就会最终得到这个数字:-125
![]()
这里还有一个例子
int main()
{
char c1 = 1;
short c2 = 1;
printf("%u\\n", sizeof(c1));
printf("%u\\n", sizeof(c2));
printf("%u\\n", sizeof(+c1));
printf("%u\\n", sizeof(+c2));
printf("%u\\n", sizeof(-c1));
printf("%u\\n", sizeof(-c2));
}
这种 +c1(c2)和 -c1(c2) 也是表达式,计算大小的时候也会发生整形提升。
看到这里不知道你对整形提升增加一些看法,最后也是,byebye
![第5章,[Win32 章节] :边框绘制函数(六)-171主机测评](https://www.171host.com/wp-content/uploads/2026/08/20260822144238-6a89b55eb002b-220x150.png)





