C语言数据在内存中存储---整型提升练习

前言:学习了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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

让我三行代码

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值