《一站式学习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 预处理的步骤

这里有一个语句

#define STR "hello, "\
                "world"

这条语句经过预处理之后为

#define STR "hello, "    "world"

然后我疑惑的点在于之后它有一个语句

printf(STR);

这条语句是和下面的语句等价的

printf("hello, "    "world");

而上面这条语句经过测试,又是和下面这条语句是等价的

printf("hello, world");

然后我又测试了一下 Python,发现它也是如此,就是当两个字符串连接在一起(中间有若干个空格),程序在执行时会自动把它们拼接称一个字符串。有点神奇。

然后我再继续往下读,发现,原来这是预处理做的事情。这一下子就豁然开朗了。同时,我认为,除了 C 和 Python,可能很多其他的语言也是有这个特性的。

关于 Python 这个字符串的特性,更多的还可以参考知乎这篇博客:https://zhuanlan.zhihu.com/p/43760216

20.2 宏定义

这一节作者提了一个问题,就是示例代码 20.1 中函数的时间复杂度是多少。

代码如下

#define MAX(a, b) ((a) > (b) ? (a) : (b))

int a[] = {15, 3, 5, 2, 1, 0, 8, 7, 6, 4};

int max(int n)
{
    return n == 0 ? a[0] : MAX(a[n], max(n - 1));
}

int main(void )
{
    max(9);
    return 0;
}

这里涉及到宏展开,我们可以先展开然后再分析,经分析,可得如下递推式

\[ T(n) = 2T(n - 1) + O(1) \]

如此,根据此式即可求得时间复杂度了。


《一站式学习C编程》读书笔记
http://fanyfull.github.io/2021/06/09/《一站式学习C编程》读书笔记/
作者
Fany Full
发布于
2021年6月9日
许可协议