数据在内存中的存储之题解应用

前几篇文章,带着大家了解了数据在内存中的存储,今天带大家来看看相关的陷阱题型和题解。

第一个:

大家来看一下这段代码的执行会输出什么:

int main()
{
	char a = -1;
	signed char b = -1;
	unsigned char c = -1;
	printf("a = %d,b = %d,c = %d", a, b, c);
	return 0;
}

好的,我们来看一下结果:

数据在内存中的存储之题解应用_第1张图片

那么结果是怎么来的,我们应该如何理解过程呢,下面请跟着我一起来看看吧!

首先,我们看代码应该这样来看,变量赋值的过程就是把数据放进开辟空间的意思

对于char a = -1;就是把-1的二进制序列放入一个1个字节大小的空间中

-1的二进制序列为

原码:10000000 00000000 00000000 00000001

反码:11111111 11111111 11111111 11111110

补码:11111111 11111111 11111111 11111111 

由于将数据放进1个字节的空间发生截断

所以空间a中存储的数据为:11111111

同理 b  c也是一样的。

接着,来到打印

用有符号的十进制的整数形式打印a,b,c

这里就会发生整型提升(关于整形提升的讲解我会把链接放在评论区)

a = 11111111,将首位看作为符号位整形提升后:

a在内存中的存储序列为: 11111111 11111111 11111111 11111111(补码)

反码:111111111 11111111 11111111 11111110

原码:10000000 00000000 00000000 00000001

打印就是-1,b是同理,对于c来说

由于c的类型是无符号的字符形,整型提升后的序列为:

00000000 00000000 00000000 10000001

由于是有符号的打印方式,打印的时候将首位看作为符号位,是正数,原、反补码一致

直接打印就是255

 今天就简单带大家感受一下,欢迎指正相互学习。

你可能感兴趣的:(算法)