前言:学习了C语言中的整型提升,总是感觉听的时候很明白,但当自己做题的时候,又总是遗漏了哪一步。自己的感悟:整型提升步骤以及原理都一样,就是把步骤记清楚一步一步的来就行。因此通过下面的一道题来每日复习。
前景回顾:
整型提升:一个表达式中的操作数大小达不到一个整型类型大小的时候需要整型提
升。
下面将对代码进行逐行分析,达到抽丝剥茧的效果。
上代码:
#include <stdio.h>
int main()
{
unsigned char a = 200;
unsigned char b = 100;
unsigned char c = 0;
c = a + b;
printf("%d %d", a + b, c);
return 0;
}
输出:
分析
1、unsigned char a = 200;
变量a是200,200是个正数,所以a的原码,反码,反码相同:
00000000000000000000000011001000
【重点:】这里需要对a进行截断。
因为a是char类型的数据,只能存放8个bit位的数字。而00000000000000000000000011001000现在是32bit位的数字。所以只截断后8bit位的二进制数。
所以截断后:11001000
同理:
2、unsigned char b = 100;
变量b是100,100是个正数,所以b的原码,反码,反码相同:
00000000000000000000000001100100
同理截断后为:01100100
3、c = a + b;
首先看到需要a+b了。
a和b现在是未满足一个整型数据大小的,所以需要整型提升。
【重点】:整型提升是按照变量的数据类型的符号位来提升的。
记住一句话:对那个变量进行整型提升,就先看这个变量的数据类型。
这里分两种情况:
- 如果该变量是无符号类型的,高位是有效位,全部补充0即可。
- 如果该变量是有符号类型的,高位是符号位,需要全部填充符号位。
那现在a、b都是unsigned char,说明都是无符号类型,所以只需要高位只需要全部补充未0即可。(一直补充道32bit位)。
所以:
- a整型提升后的结果:00000000000000000000000011001000
- b整型提升后的结果:00000000000000000000000001100100
然后a+b的结果就是:00000000000000000000000100101100
因为变量c也是char类型的数据,所以还需要截断,c存储的就是:00101100。
4、printf(“%d %d”, a + b, c);
可以看到,a+b、c都是以%d的形式打印,所以打印前还需要整型提升。
c现在存储:00101100,c是unsigned char 无符号类型的,高位是有效位,全部用0填充即可。
所以c整型提升后的结果就是:00000000000000000000000000101100。
然后打印c,打印需要根据原码打印,现在00000000000000000000000000101100数补码,但是c是无符号类型的,并且c的高位是0,0表示正数,正数的原码=反码=补码。
所以c的结果转为十进制就是44。
之后再来看a+b的结果,现在a+b的结果并没有存在c变量中。
上面说了a+b的结果是:00000000000000000000000100101100,高位也是0,0表示正数,正数的原码=反码=补码。所以直接将此二进制转为十进制的结果就是:300。