[c语言日寄]赋值操作对内存的影响
【作者主页】siy2333
【专栏介绍】⌈c语言日寄⌋:这是一个专注于C语言刷题的专栏,精选题目,搭配详细题解、拓展算法。从基础语法到复杂算法,题目涉及的知识点全面覆盖,助力你系统提升。无论你是初学者,还是进阶开发者,这里都能满足你的需求!
【食用方法】1.根据题目自行尝试 2.查看基础思路完善题解 3.学习拓展算法
【Gitee链接】资源保存在我的Gitee仓库:https://gitee.com/siy2333/study
文章目录
- 前言
- 题目引入
- 分析
- 向char类型中赋值int类型的98
- 向char类型中赋值int类型的-1
- 向char类型中赋值0x11-00-00-22
- 总结
前言
在 C 语言中,赋值操作是最基础且频繁使用的操作之一。无论是简单的变量赋值,还是复杂的数据结构初始化,赋值操作都直接涉及到内存的分配、存储和访问。然而,许多初学者对赋值操作背后的具体的内存操作细节并不熟悉。
在本篇博客中,我们将通过具体的题目来深入探讨赋值操作对内存的影响,并通过实际代码示例和分析,帮助读者更好地理解 C 语言中的内存操作机制。
题目引入
#include<stdio.h>
int main() {
char a;
a = 98;
printf("%c", a);
return 0;
}
这是一个简单的代码,它运行后会打印字符’b‘。相信很多人都知道,这个函数会将变量a赋值为98,然后printf函数调用a的值,即98,98对应的ASCII码为‘b’,所以会打印出‘b’。
但是,98明明是int类型的值,本应该占据4个字节,又是怎么存储到仅仅有1个字节的a中呢?在内存中发生了什么我们不知道的故事呢?
分析
向char类型中赋值int类型的98
我们打开VS2022的调试界面,使用内存和监视功能,观察内存的变化。
我们执行一下赋值语句,观察内存的变化:
int型98的二进制形式为:
00000000-00000000-00000000-01100010
16进制形式为:
00-00-00-62
此时有两种可能的内存操作发生了:
- 电脑将00-00-00-62储存到地址为&a的内存中。
- 电脑将62储存到地址为&a的内存中。
为了更进一步的了解内存的变化,我们需要修改程序来观察。
向char类型中赋值int类型的-1
我们知道,-1的原码为:10000000-00000000-00000000-00000001
反码为:11111111-11111111-11111111-11111110
补码为:11111111-11111111-11111111-11111111
16进制为:ff-ff-ff-ff
如果我们为char类型赋值-1,就可以确定前面究竟是执行了哪一种内存操作了。
![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/0bae2
没错,我们发现数据只有一部分被储存到地址为&a的内存中,也就是说数据在存放前就发生了截断。
那么,保留的前面字节的值,还是后面字节的值呢?
向char类型中赋值0x11-00-00-22
我们构建一个int类型的数,确保它的十六进制的值为:11-00-00-22。
这个数的二进制位:00010001-00000000-00000000-00100010
转换为10进制为285212706。
我们发现,只有低位的22被保留下来。
此时,我们已经理解了赋值操作的流程:
总结
赋值操作是 C 语言编程中最基础的操作之一,但它背后涉及到复杂的内存操作机制。通过本篇博客的介绍和分析,我们希望读者能够更好地理解赋值操作对内存的具体影响。
关注窝,每三天至少更新一篇优质c语言题目详解~
[专栏链接QwQ] :⌈c语言日寄⌋CSDN
[关注博主ava]:siy2333
感谢观看~ 我们下次再见!!