计算机原理杂记
1. 进制
10进制,16进制如何转化为2进制,很容易,不讲。这里要说的是他们的意义:
- 10进制是人类计数语言,计算机不认识
- 2进制是计算机语言,人类不认识(位数太长,容易数错,不方便读写和计算)
- 16进制是为了使人类方便读写2进制而广泛应用的(如\x01表示一个字节00000001;有多少个\x**就有多少个字节,如\x42\x4d\x38\x8c表示4个字节)
2. 大小端
大小端指的是每个存储单元在内存中内部字节的存放顺序的不同。(注意:不是存储单元在内存中的存储顺序)
总结:两正一反 和 大端是一致的(大端是正序)
- 在大小端中,变量(如:a,b,c,d)在内存中的存放顺序没变(都是正序)
- 在大小端中,变量的每个字节的内部二进制(如:大端中第一行第四个字节为\x01,小端中第一行第一个字节也为\x01)顺序没变(都是正序)
- 在大小端中,变量的内部字节的存放反了(大端是正序,小端是逆序)(如变量a在大端中为:\x00\x00\x00\x01,在小端中为:\x01\x00\x00\x00)
记忆法:(有需要再看)
- 大端,又叫高尾端,即尾巴在高位,对于a=\x00\x00\x00\x01,来说\x01就是尾巴,所以\x01在高位,所以字符串顺序与存储顺序一致
- 小端,又叫低尾端,反之。
3. 编译型语言和解释型语言
粗略的感官分析:
- 我们把程序运行内存分为“数据结构区”和“执行区”;
- 编译型语言在执行时,先把所有的对象或函数等装入数据结构区,然后从数据结构区中找到开始执行点放入执行区执行;
- 解释型语言在执行时,直接依次加载每一行代码到执行区执行,如果遇到对象或函数等就放到数据结构区留着以后使用。
4. 函数式编程
最大的特点:函数可以作为变量或参数被赋值或传递
闭包:我们可以动态的构建或生成函数体
我们来实现一个可变参数的求和。通常情况下,求和的函数是这样定义的:
def calc_sum(*args):
ax = 0
for n in args:
ax = ax + n
return ax
可以不返回求和的结果,而是返回求和的函数:
def lazy_sum(*args):
def sum():
ax = 0
for n in args:
ax = ax + n
return ax
return sum
在这个例子中,我们在函数lazy_sum中又定义了函数sum,并且,内部函数sum可以引用外部函数lazy_sum的参数和局部变量,当lazy_sum返回函数sum时,相关参数和变量都保存在返回的函数中,这种称为“闭包(Closure)”的程序结构拥有极大的威力。