全部学习汇总: GreyZhang/g_unix: some basic learning about unix operating system. (github.com)
前面对于汇编有了一个基本的了解,这一章节主要是看一下汇编视角下的数据表达以及计算方式。
1. 整形会有有符号和无符号两种,一般都是用最高位作为符号位。
2. 如果简单使用一个符号位和剩下的位组合成为一个有符号数,0会有2种表达。0本来不应该有正负,且只有一个数值。因此,为了处理这样的问题会增加CPU逻辑的复杂度。
1. 上面的表达方式带来的另一个问题是正负数的相加需要转换成减法来处理,这也会增加CPU逻辑的复杂度。
2. 另一种表达方式是采用补码处理的方式来进行相关的运算,相比之前的一种方法,在计算正负数的处理上有了改进,但是依然存在正负0的问题。
3. 第二种补码方式我其实是熟悉的,大学时候的教科书中的设计其实就是这个。这也是现代计算机中采用的方式,补码加1。
1. 采用第二种补码的方式,最大的改进点就是2种0的方式只剩下了一种。
2. 汇编语言,或者说CPU,处理的数据对象究竟是有符号的还是无符号的,这个由指令决定。归根结底,是由写代码的程序员来定。
这一页讲到的size的扩展,可以类比C语言中的数据类型转换来理解。
如果size减少,处理比较简单,一般来说就是直接截断。如果是扩充,相对来说就复杂一些。好的是CPU增加了一些这方面的指令,简化了软件操作。从这一页的描述能看到,有些处理所用的寄存器是固定的。
这个问题之前的确是没有关注到,为什么fgetc返回的会是int?很重要的一点就是为了兼容EOF的判断。因此,第二个程序可能会有误判的问题。
如果字符类型是无符号的,可能会导致死循环。如果字符是有符号的,那么可能会提前中断。
这一页介绍了一些算法的具体实现,这部分信息不去仔细看了,我觉得比较合适的方式还是在实战中品味理解。
继续往后会是代码的调试与理解,这部分我觉得单独分离出来整理更好一些。这次的小结暂且到此结束。