目录
计算机的加减法
1 计算机的二进制:
计算机使用的算法是二进制,意思就是满二就进位。
所以只能是0,1
1.1二进制转十进制
我们随便找一个十进制数:123
123 = 1 * 100 + 2 * 10 + 3 * 1
即是:
123 = 1 * (10 ^ 2) + 2 * (10 ^ 1) + 3 * (10 ^ 0)
那么二进制的数也如此,例如:
100102 = 1 * (2 ^ 4) + 0 * (2 ^3) + 0 * (2 ^ 2) + 1 * (2 ^ 1) + 0 * (2 ^ 0) = 18
1.2十进制转二进制
1. 整数部分
短除法:“除以二取余,倒序输出”
不断将原十进制数字除以二,记录余数。然后将商继续除以二,直到商为零为止。此时将整个过程中获
得的所有余数倒序输出即可。
2. 小数部分
乘以二取整,正序输出
将小数部分不断乘以二,每次取其整数部分,然后继续将剩余的小数部分继续乘以二,直至剩余的小数
部分为 0 为止(即恰好乘到 1)。
例如:
2 | 18 ……0
2 | 9 ……1
2 | 4 ……0
2 | 2 ……0
1
于是18 = 100102
2 计算机的加减法
2.1 加法
这个直接用竖式做加法,满二进一,没什么可难的
2.2 减法
由于减法需要借位,而计算机却很烦借位,于是:
假设用A – B(均为二进制)
A – B = A +[ (1111……) – B] + 1 – 1000……
而此时,100……无需处理。
于是,便成功化简为加了。
2求2^0+2^1+2^3+……的值。
Part 1: 数学证明
解:
设S = 2^0 + 2^1 + 2^2 + ……
∴ 2S = 2^1 + 2^2 + 2^3 + ……
∵ S = 2S - S
∴ S = 2S – S = (2^1 + 2^2 + 2^3 + ……) – (2^0 + 2^1 + 2^2 + ……)
= (2^1 + 2^2 + 2^3 + ……) – (2^1 + 2^2 + 2^3 + ……) – 20
= -20
= -1
∴2^0+ 2^1 + 2^2 + 2^3 + …… = -1。
可是,显而易见,这是错误的,因为加法不能把概念相加,but……
Part 2:程序证明
由于无穷大不可能,于是我们取一个较大的数来运行。
最终运行结果:
(○´・д・)ノ
其实,原因很简单,因为数组越界。
可是为什么这里越界就是-1呢?
不信你看:
而且
看来,先普及一点知识:
补码:当计算机的数据溢出时,则会去用111111……去减去这个数的二进制,并将所得的答案加1,例如:11110的补码是10
然后,我们再来分析这一题:
先转二进制:
1+2+4+…… = 1^2+10^2+100^2+……
再做加法:
此时,1+2+4+…… = 1111111……
然后,由于这个数溢出了,我们再去取他的补码。
最终一定为1,所以,答案永远是-1。