本文内容约 1600 字,本文最早在公众号:善始者實繁克終者蓋寡 中发出。html
目前是一名在校的大一学生,有时想写些内容出来,但苦于脑子里没东西。提笔又落笔,迟迟没有内容产出。想起以前我还在这个公众号里立下说:天天一篇文章。诶,又抬头看了看这个公众号的名字,诶。前端
接下来,打算重拾公众号,尝试输出内容。另外,公众号的介绍也修改了:程序员
前端初学者、设计门外人,一切才刚刚开始…网络
通过一段时间的思考和了解后,我把本身定位为**「全栈偏前端软件工程师」**,可是毕竟这条路没有走过,具体能走到哪一步,将来具体如何不是很清晰。不过如今先踏踏实实从前端入手,一点点搭建本身的神经网络。设计
本篇内容讲一讲计算机的一些基础:3d
简单说:日志
在计算机系统中,数值一概使用补码来表示和存储。cdn
简单说就是把原二进制码,先按位取反(0 变 1,1 变 0)后,再加 1。htm
下面用「有符号 4 位二进制」来举个例子:blog
最后的结果能够看到,这个数字的最高位为 1,确实是负数。一个正数的补码也就是相对应的负数。要是咱们反过来运算:
也就是一个负数的补码就是其对应的正数。
补码转为二进制原码,也能够先减 1,再取反。
简单总结为:a 的补码就是 -a (a 能够是正负数)
不过有两个数的补码等于自己:一个是 0,另外一个是该「有符号位的二进制」所能表示的最大负数(100……)
直接举例说明:
补码转十进制的规则,也就是除了「最高位」外,「其余位」对应数字的处理和通常二进制相同。若是「最高位」为 1,那么它表示的数字为 -2^(n−1),n 表明位数,最终将各个结果相加就是十进制数了。
上面举例介绍了如何获得补码。如今来讲说「补码系统」中的数字是如何表示的:
那么补码数字所能表达的数字范围为:
好比 8 位的补码数字,能够表示范围为:-128~127。
为何最大值要减去一个 1?有符号位的 n 位二进制能够用来表示两组数,一组是大于等于 0,另外一组小于 0。
由于 0 的存在,因此须要减去一个 1。
不是说计算机是用二进制的吗?干吗要搞一个「补码系统」?
补码系统的最大优势是能够在处理加减乘除法时只用一种加法电路。
咱们先来试试用反码来计算减法:
答案正确啊。那咱们继续看看反码的特殊状况:
这就出现问题了,出现了 -0 这种状况。虽然说 -0 和 +0 应该都是 0。可是 0 带着符号是没有任何意义。
解决这个问题,就须要补码了:
正好能够计算出 -1 这个答案。
这里没有演示原码的减法,你不如动手去试试。
维基百科中是这样说的:
指定 n 位长,那么就有 2^n 个可能的值,加减法运算都存在上溢出与下溢出的状况,实际上都等价于**「模 2^n」**的加减法运算。这对于 n 比特无符号整数类型或是 n 比特有符号整数类型都一样适用。
嗯。
看了一堆写原理资料,仍是没怎么搞懂,总之原理和余数的思想有关。
因此我如今所处的阶段是:知其然,「知其因此然」得还不怎么透彻。
可是我仍是要讲一讲。
看了阮一峰的网络日志《关于2的补码》这一篇文章后,以为文章中的解释仍是十分清晰的。那我就用几张图来讲明一下。在一个 4 位的二进制中,进行 5 - 6 的运算,咱们能够把 5 - 6 转化为 5 + (-6)。
咱们已经分别知道 5 和 6 的原码,要获得 -6 咱们能够用 0 - 6 获得 -6 的二进制码:
可是 0 根本不够减啊。那咱们想一想,在作十进制减法的时候,要是这一位不够减,怎么办,答案是问上一位借一个 1。那 0000 去借一位 变为 1 0000 :
咱们又注意到,1 0000 实际上是能够用 1111+ 1 来表示的,那把算式变为:
第一步操做就至关因而按位取反,第二步再 +1,这个过程和获得反码的步骤彻底一致。