本文內容約 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,這個過程和獲得反碼的步驟徹底一致。