欢迎光临散文网 会员登陆 & 注册

【C语言】内存模型

2021-09-01 09:08 作者:GC_CH  | 我要投稿

    太极生两仪,两仪生四象,四象生八卦,八卦衍万物。

    计算机世界中的一切都是由内存表示,所有的编程归根到底不过是对内存的读写,了解了内存模型,C语言也就手到擒来了。

    所谓内存,并不复杂,就是一个很大很大的空间而已,可以存放计算机世界的任何东西。

存钱与取钱的故事

    假如银行里一个保险柜只能放256块钱(不要问为什么只能放这么少,因为放的是金砖),那么两个保险柜就能放512块钱,四个保险柜就能放1024块钱......

    此外,银行里有很多个保险柜(大概42亿个),为了管理,银行肯定需要给每个保险柜编号的,并且管理员有个特殊的爱好——编号从0开始,那么保险柜的编号就是0,1,2,3,4,......,42亿-1。

    好了,现在该到你存钱和取钱的时候了。

   你不能直接将钱放到银行的保险柜里,你只能把钱交给银行的工作人员,然后由工作人员把钱放到保险柜里;你也不能直接将钱从保险柜里取出来,而是由银行的工作人员取出来,然后再把钱交给你。

 存钱与取钱与内存的故事

    保险柜就是计算机的内存,银行的管理员/工作人员就是计算机,你就是你,你与银行工作人员交流用的是汉语,而与计算机交流用的是C语言(或其他编程语言)。

    一个保险柜最多能装256块钱,一个字节最大能表示256个数;两个保险柜最多能装512块钱,两个字节最大能表示65536个数;四个保险柜最多能装1024块钱,四个字节最大能表示4,294,967,296个数。

    为什么它们的增量不同呢?因为前者表示的是装得下多少个,后者表示的是能表示多少个,你把前者换成能装下多少种水果,它们的增量就差不多了。

    还有一个点,那就是编号,内存的编号称为地址。内存和保险柜完全一样,从0开始编号,一直到最大内存减1,每个字节占用一个编号。也就是说字节是最小的可寻址单位(寻址就是寻找内存单元,要读写内存单位就需要给出内存单元的地址)。

计算机世界的事物

    计算机世界的任何事物都是由内存表示的,区别仅是根据事物的大小占用不同大小的内存而已。

    比如,阴与阳,最小只需要用一个比特(bit)就可以表示。一个比特通常等于1/8字节,比特是最小的数据单位,相当于现实世界中的最小粒子,计算机世界的所有事物都是由一个个比特构成的。

    又如,一棵树,树有很多属性(特征),那些不重要的属性就可以不管了,就像物理学中抽象出的质点一样。如果你关心树的名称,高度和重量,那么名称就可以用100个字节表示,每两个字节表示一个汉字,最多可以表示50个汉字,这足够了。高度和重量都是实数,那么用4个字节来表示,计算机中的实数也是有范围了。至此,需要108个字节来表示这棵树。

计算机世界到现实世界

    计算机世界的事物最终是要反馈给人的,要么以图像的形式让人能看到,要么以声音的形式让人能听到,那么这是怎么转换的呢?

    事物最终存储在内存中,内存中的数据最终都是以二进制的形式存储的(一个个的比特的形式),既然都是一样的,为什么有些被认为是图片,有些被认为是音频呢?这个问题的答案很简单,事物是人定义的,只要根据同样的定义把数据读取出来就能得出想要的事物了。

    比如,一个图像,当你把它保存为jpg格式的文件的时候,那个文件中必然有一段数据能唯一地标识出这个文件的类型。

    有趣的是,同样的一段数据,你把它理解为什么事物都是可以的。比如,上面所说的那个图片文件,你同样可以用记事本来打开它,记事本中出现的文本就是它的数据的文本的形式,不过大概率是外星文(乱码)。

 总结

    在计算机世界中,所有事物最终都是以同样的形式表示的,理解了这点,你就可以随心所欲的发挥,创造出任何你想要创造的,成为那个世界的神!

【C语言】内存模型的评论 (共 条)

分享到微博请遵守国家法律