《一站式学习C编程》读书笔记
16.2 CPU
原书内容摘录如下
3.执行指令,读内存,取上来的数是3,保存到eax寄存器。注意,地址0x804a01c~0x804a01f里存储的四个字节不能按地址从低到高的顺序看成0x03000000,而要按地址从高到低的顺序看成0x00000003。也就是说,对于多字节的整数类型,低地址保存的是整数的低位,这称为小端(Little Endian)字节序(ByteOrder)。x86平台是小端字节序的,而另外一些平台规定低地址保存整数的高位,称为大端(Big Endian)字节序。注意上图只画了前三步,剩下的步骤读者可以自己画图理解。
我这里主要是想学习大端序和小端序这个知识点,然后在这里发现此知识点,但是,这里原书说的地址 0x804a01c~0x804a01f 里存储的四个字节按小端序取出来是 0x00000003,我一开始没有理解,然后,想了一段时间,发现它这每一个地址(比如 0x804a01c)中存储的都是一个字节,也就是一个两位 16 进制的数,对于图中 0x804a01c~0x804a01f 地址存储的数,我们要很自然地想到它省略了高位的 0!也即 0x804a01c~0x804a01f 地址存储的数依次为 03、00、00、00。这样以来,才合理嘛。
20.1 预处理的步骤
这里有一个语句
这条语句经过预处理之后为
然后我疑惑的点在于之后它有一个语句
这条语句是和下面的语句等价的
而上面这条语句经过测试,又是和下面这条语句是等价的
然后我又测试了一下 Python,发现它也是如此,就是当两个字符串连接在一起(中间有若干个空格),程序在执行时会自动把它们拼接称一个字符串。有点神奇。
然后我再继续往下读,发现,原来这是预处理做的事情。这一下子就豁然开朗了。同时,我认为,除了 C 和 Python,可能很多其他的语言也是有这个特性的。
关于 Python 这个字符串的特性,更多的还可以参考知乎这篇博客:https://zhuanlan.zhihu.com/p/43760216。
20.2 宏定义
这一节作者提了一个问题,就是示例代码 20.1 中函数的时间复杂度是多少。
代码如下
这里涉及到宏展开,我们可以先展开然后再分析,经分析,可得如下递推式
\[ T(n) = 2T(n - 1) + O(1) \]
如此,根据此式即可求得时间复杂度了。