作者回复: 不记年同学你好,
你的思考很对,实际的加法器,并不是由全加器串联组成的,在14讲里面我们可以看到为了减少门延迟的损失,实际高位的计算结果直接来自低位的组合电路里面的输入。
封装意味着我们提供了更多的“简单电路”或者说“简单指令”来操作。但这也意味着同样复杂的操作需要更多条指令。
这个也是为什么在计算机体系结构里面会有 RISC 和 CISC 这样的复杂/精简 指令之争。
作者回复: 一步同学你好,
谢谢指出,的确是从右到左计算,我修改一下。
作者回复: 👍
作者回复: 加油
作者回复: 👍
作者回复: 我不知道我有没有准确理解你的意思
两个负数相加,是否溢出,其实不是看最后多出来的进位的信号。而是也要看计算结果的最高位是1还是0
如果两个输入的高位是1而输出的高位是0,那么就溢出了,如果输出的高位还是1就没有溢出。
你这里的a,b,c是不是指输入a,b和输出c的左侧的高位(不是进位的溢出位)?我的理解没有错吧?
作者回复: 是的,不过可以思考一下两个负数的相加或者整数的相加是否也会溢出?怎么通过电路来告诉大家是发生了溢出?
作者回复: cc同学你好
的确不是每个计算都需要进位,但是我们的电路必须准备好可能发生进位。
而进位的时候,可能来自当前位两个1的相加会发生进位。
但还有一种可能,就是当前位只有一个1,但是从更低位又进位来了一个1,这样也需要向高位进行进位。
作者回复: 如果是写程序模拟的话有很多办法,比如有人用Minecraft 做了一个虚拟的CPU http://mc.163.com/2017/04/07/25535_682214.html
如果是硬件,如果只是为了体验,最简单的办法是用电路绘画导电笔直接在纸上画了来体验一下
或者也可以去淘宝上买个组合电路套件自己来搭一下。
作者回复: 是的,就是把与门和或门的真值表取反
作者回复: 一般情况下,这些是“数据”而不是“程序”,会放在单独的数据文件里面,在编译的过程中并不会用到。
作者回复: 回答正确,不过可以再想想补码情况下,如何处理溢出呢?
作者回复: 栈溢出我们在前面讲stackoverflow已经讲过啦,可以去看第7讲。
空指针,其实也很容易里面,我们期望在某个数据里面放上一个内存地址,但是并没有真实设置对应的值,那么里面要么是对应内存初始状态,可能就是一个错误的地址,会导致程序出错呀。