我正在参加哈佛大学的MOOC课程。在第一堂课中,我们学习了不同数据类型的变量:int
、char
等。
我所理解的是main
命令(在main
函数中)int a = 5
在堆栈上保留一定数量的内存字节(大部分为4字节),并将表示5
的一系列0和1放在那里。
相同的0和1序列也可能表示某个字符。因此,需要有人跟踪这样一个事实,即为a
保留的内存位置中的0和1序列将被读取为整数(而不是字符)。
问题是谁会跟踪它?通过在内存中的这个位置粘贴一个标签,上面写着"嘿,无论你在这4个字节中找到什么,都可以读成一个整数"?或者C编译器,它知道(查看a
的类型int
),当我的代码请求它使用a
的值执行某些操作(更准确地说,生成执行某些操作的机器代码)时,它需要将该值视为整数?
我真的很感激为C语言初学者量身定做的答案。
对于C语言,它是编译器。
在运行时,堆栈上只有32位=4字节。
您问"通过将标签粘贴到此位置来获取计算机的内存...":这是不可能的(对于当前的计算机体系结构--感谢@ivan的提示)。存储器本身只有8位(0或1)个字节。内存中没有任何地方可以使用任何附加信息来标记存储单元。
还有其他语言(例如LISP,在某种程度上也包括Java和C#)将整数存储为数字的32位加上一些位或字节的组合,这些位或字节包含一些位编码的标记,在这里我们有一个整数。因此,例如,32位整数需要6个字节。但对于C,情况并非如此。你需要来自源代码的知识才能正确解释在内存中找到的位--它们不会自行解释。并且已经有了在硬件中支持标记的特殊架构。