C语言完全听懂系列 - day3

  • 一台电脑会有CPU,内存,硬盘。

  • CPU可以用来执行各种指令,比如最基本的加减乘除,而其他所有复杂的操作,都可以认为是由加减乘除的排列组合来实现的。甚至减、乘、除本身,也是由加法来实现的。计算机世界是典型的道生一,一生二,二生万物。类比一下的话,数学界会先定义几条最基本的公理,然后由此推导出一系列的定理和公式;艺术界先有了最基本的三原色,然后组合出了七种最常见的色系,进而组合出千万种颜色。

    • 扩展:其实减法本质上是加一个负数,乘法本质上是加n次,而除法本质上是乘一个数的倒数,他们在数学上就是“派生”关系的。
  • 内存用来临时存储CPU执行指令时需要的数据,比如说算1+2,1和2是数据,+是操作,CPU就会读两次内存,然后把拿到的两个数加在一起。计算的结果往往会写回内存,CPU只管“加”这个操作本身。CPU的运算速度是非常快的,每秒钟可以执行十亿条指令,或者说十亿次加法,每次加法都要读两次内存获取数据的话,那内存的读取速度也必须非常非常快才行,要不然就会严重拖CPU的后腿。现代内存为了尽量不拖后腿尽可能提高读写速度,一是容量做的比较小,16个G左右,二是采用了更快更简单的物理结构,导致内存只要断电(关机),数据就会全部消失,下次开机就是一条啥也没有的全新内存了,没办法持久性存数据。

  • 硬盘就是为了解决内存的两大缺点而出现的,一方面支持永久性的存数据,二是容量很大很大。主要的缺点就是读写很慢,慢到CPU实在不能接受,所以CPU一般不和硬盘打交道,基本只跟内存玩,只有特定的时候才会读写一次硬盘。举个例子,你在word里写东西,编辑这件事是CPU在做,编辑的内容都会临时存在内存里,当且仅当你按一下Ctrl + S保存一次的时候,才写一次硬盘。如果你中间电脑突然关机了,还没保存的那部分因为还在内存里,就没有了,下次开机只能看到保存过的数据。这就是“保存”这个功能的原理,所有的软件都是这样。

  • image

  • 今天我们尝试写一段程序,把狗狗的岁数换算到人类的岁数,然后输出

  • 我们先从简单的情况开始,假设狗的岁数 * 7 = 人类的岁数,假设狗是2岁。

#include <stdio.h>
int main() {
    int dog_age = 2;
    int human_age = dog_age * 7;
    printf("human age is: %d", human_age);
}
  • 狗的岁数作为一项数据,我们需要先保存在内存中,方便后续CPU执行计算操作,第3行就是在内存中找一块位置,存储一个2的意思。既然我们存起来是为了之后用,那我们之后就得能找的到,所以给这一小块内存取了一个名字,叫dog_age。后面我们代码里再出现dog_age的时候,CPU就知道去哪里读取数据了。既然我们要“申请”一块内存,就要告诉CPU我要多大的内存,总不能说个随便,计算机听不懂随便,是多少就是多少,int暂时理解为4个字节的意思。第3行代码整体的意思就是,申请4字节空间,取名为dog_age,存储的数据是2。
  • 字节就是B,Byte的简写,更常见的是KB, MB, GB, 每次乘1024。每个字节里有8个bit(中文叫位),每个bit是一个0或者一个1。计算机里所有的数据,都存储为0和1。对于我们刚刚的数据2,我们申请了4字节 * 8 = 32个bit,而数字2,转成二进制,就是10,也就是这块内存里存的实际上是
00000000 00000000 00000000 00000010
  • 假如说我们把这块内存存满,也就是全都是1,32个1,大约是十进制的42亿。大于42亿的,就需要更多的字节来存。就不能用int了。

  • 扩展:为什么存一个数字2,我们直接申请了4个字节的空间呢,其实申请1个字节(操作系统最少申请1个字节,不能申请5个位这样),也就是8位其实就够了吧?最浅显的理解就是,每次直接申请4个字节,电脑执行起来是更快的,而省内存省空间这件事一点都不重要,因为绝大多数时候,电脑的内存根本用不满,不需要节约内存;而内存经常用满的电脑,用户会自己加钱去加内存条,所以也不需要我们写软件的时候节约内存。软件卡不卡很直观,但多占几MB内存,没人会在乎的。至于技术层面的“为什么”我没想好怎么写,先不写了。

  • 第4行,我们读取dog_age,然后乘7,申请一块空间,把结果存到这块内存里,取名为human_age。这些取了名字,可以读写的小块内存,在编程里称之为“变量”,可以改变的量,申请一块内存从编程角度来讲叫“定义一个变量”。

  • 第5行,我们读取计算好的岁数,输出结果。我们现在的想打印human_age的值,我们如果这样写肯定不行,

printf("human_age");
  • 我们需要的是这个变量(这块内存)中存储的真实数据,这样写他打印的是这个字符串,"human_age"和名为human_age的变量毫无关系。那我们的第一反应就是
printf(human_age);
  • 这样写也不行,printf输出的时候,必须提供一个文本,或者说字符串。这样写相当于把数字14提供给printf了,他不知道怎么处理。我们要做的就是读取human_age的数据,插入到一个字符串里:
printf("%d", human_age);
  • %开头+一个字母的这种,是占位符,会被替换为后面的真实数据,d是decimal,十进制形式的意思。printf还支持用其他格式输出这个数据,比如%x是十六进制,这里不多展开了。我们再在前面补充一些其他的文本,就是第5行代码了。
posted @ 2025-04-16 21:06  merlbc  阅读(27)  评论(0)    收藏  举报