码农翻身摘录
三次握手:驗證雙方發信和收信能力問題
?第一次握手:京城發信,縣衙收到了,此時縣衙就會明白,京城的發信能力和自己的收信能力沒有問題。
?第二次握手:縣衙發信,京城收到了,此時京城就會明白,京城的發信和收信能力都是沒有問題的,縣衙的發信和收信能力也都是沒有問題的。但是縣衙還不知道自己的發信能力如何,所以需要第三次握手。
?第三次握手:京城發信,縣衙收到了,其實第二握手的時候京城已經知道雙方的收信、發信能力都是沒有問題的,這次回應的目的只是消除縣衙對自己的發信能力和京城的收信能力的擔憂而已。
為什么需要補碼
?熱愛編程的張大胖在大學時最煩的一門課之一就是《數字電路》 , 他一直覺得和編程沒什么關系。有一次課程設計是實現一個加法器, 大胖使用邏輯電路, 費了九牛二虎之力才實現了4位的加法。
這4個二進制位能表達的數有16個, 從0 到15 :
還不錯, 再計算一下 9+7 :
9+8 = 1001 + 1000= 0001怎么變成了1 ? 奧, 我這兒只有4位,能支持的最大數字就是 15 , 而9+8的結果是 10001 (十進制16),計算結果溢出, 最高位的1被丟棄了!
其實這也符合要求, 大胖順利的交了作業。
用加法來表示減法
可是下一次課還是課程設計,老師竟然要求在這個加法器上實現減法 ,這可把大胖給難住了, 在加法器上實現減法,真是個變態的需求。
遇到了問題,張大胖自然會“跪求”好基友, 電腦高手Bill。
Bill 說:“這個要求一點都不變態,用加法器同時實現加法和減法,能極大的節省CPU的電路設計。 ”
“你就說該怎么實現吧”
Bill說:“我先給你說一下原理,在你定義的4位二進制中,一共可以表達16個數我們引入一個‘補數 '的概念,例如 3的補數 是 13,4的補數是12,5 的補數是11,當你計算7減去3 的時候,可以變成 7加上3 的補數,即 7 + 13 ”
“可是7+13 是20,但是7-3 等于4 啊”
“20其實已經超出你4位二進制能表達的16個數了,已經溢出了,對吧,所以20還得減去16 ,就是4 了。你用二進制算一下。”
10101已經溢出了, 去掉最高位是 0100 ,就是十進制4 了。
“果然不錯” 張大胖說 “這讓我想到了鐘表,現在是7點, 我想讓它回到4點, 有兩種辦法, 一種方法是讓時針后退 3 格,另外一種方法是讓時針前進9格, 前進到12點的時候, 其實就相當于溢出了,舍棄掉。 "
Bill 說, “看來你已經Get了,數學上有個詞叫做求模, 說的就是這個運算,還以時鐘為例” 。
“這是一種以進為退的策略” Bill 接著說 " 用這種辦法就把減法變成了加法"
“但是我怎么得到所謂的補數呢?從3 怎么得到13 呢”
“這很簡單, 對于二進制, 前輩們想出了一個異常簡單,又特別適合計算機的算法, 對二進制數的所有位取反,然后加1 ”。
“這就是所謂的 補碼了” Bill總結道。
Bill 問道:“剛才咱們說的都是整數的加減法, 負數你考慮了沒有啊? 大胖?”
“我也剛剛想到,現在我知道 7-3 可以換算成 7+ 13 了,如果是3 - 7 呢?”
“負數一引入,系統就變得更復雜了,首先你得用一個標志位來表示整數還是負數吧: ”
“先別急,之前說到減法可以變成加法,秘密就是用補碼,例如8-3 相當于8+(-3)的補碼 , 那我們完全可以把表格1中的負數用補碼表示,然后把那個負0 特別當做 -8來處理”。
Bill 接著說: “按照上面的表格,現在我們來計算一下 7-4 , 7是 0111,-4是 1100,注意我們把符號位也算進去了,兩者相加: “讓我試試4-7, ” 張大胖說,4是0100 ,-7是1001,兩者相加:“妙啊” 張大胖不禁贊嘆起來, “把負數用補碼表示,不但減法變加法, 連符號位都可以參與運算了!”
“ 是啊, 我們通過補碼能極大的簡化電路的設計, 你一定要記住,
"此外, 我想你也能總結出來, 你這個4位的系統如果只表示無符號數(沒有負數的話) , 它的范圍是[0 , 2 ^ 4] ,即[0, 16] ;
如果要想表達有符號數(負數和整數), 它的范圍就是[-2^3, 2^3-1] , 即[-8, 7] 。 在高級編程語言像C, Java ,你經常會看數據類型的取值范圍, 你應該明白其中的原理了。
總結
- 上一篇: mysql下载简书_安装MySQL
- 下一篇: 粉末XRD解单晶详细的测试条件及分析方法