我對補碼的一點理解

2022-05-05 05:51:09 字數 1412 閱讀 1566

剛剛學習c語言,接觸補碼時,有些不解,計算機為什麼要把減法變成加法來運算呢

?一步到位,處理速度不更快麼?後來查了資料才知道,這與計算機本身的計算結構有關,減法變加法,物理方面更容易實現。但補碼是怎樣把減法便加法的呢?本人思考了一下,有如下心得:

我們先來看一道題:

59-18=47      就是

0011

1011     59

+  1110 1110     -18的補碼

————————

10010 1001     47

-18的原碼是

1001

0010   補碼是

1110 1110   最高位是符號位,但計算機在計算的時候是把符號位看成乙個數的,也把它當做乙個數進行計算,因此計算機計算時把

1110

1110看作是

238.我們知道

1111 1111=255,那麼把按照最高位不變取反加一的原則,

1001

0010變成補碼的過程就是

255-18+1=238,實際上這裡就是

256-18,對,

256,看到這裡你就知道(為什麼計算機要自動捨棄上面那個

紅色的一

了吧。整個過程就是

(255-18+1)

+59-256,計算機就是利用補碼把把

-18加上

256變成乙個中間數,然後再利用自動捨棄

減去256來完成減法運算的。

上面說的是正數減負數的情況,其它情況萬變不離其宗。可見計算機巧妙的利用了補碼來進行減法的運算。

再深入一點,如果我們把補碼的概念運用到其它進製中去呢?先來看看角度制,

90°與

270°是同一角,只是表現形式不同,就像計算機的補碼一樣,雖然外在不同,但其本質並沒有變。

再來看看十進位制的反碼(

這裡不用補碼是因為補碼是二進位制特有的

),18就是

100-18=82,我們來進行一下運算

59-18=47 

用反碼就是

100-18+59=

147  

我們像計算機一樣,把最高位去掉,也得到了正確結果

47,但除了二進位制的其它進製使用反碼就顯得多餘了,因為還是進行了減法運算,但計算機就不同,由於其二進位制的機制,補碼時只有把開路變成斷路,把斷路變成開路再加一就行了。這樣,在物理層面上容易實現,也解決了計算機在計算時有效避開最高位是符號位進行計算的問題。

再來看看二進位制的反碼,按照運算規則,-18的反碼就是1 0000 0000-1001 0010=1110 1110。對,就是-18的補碼。其實由於二進位制的補碼就是反碼,只是由於二進位制的特殊性,只要把它的每個位反取再加1就是它的反碼了,具體原因其實上面已經說得很清楚了。就是1

0000 0000-1111 1111=1的原因。

以上就是本人對補碼的一點理解。。。。

我對adaboost的一點理解

我理解的adaboost演算法 由程式反觀演算法 容易在介紹adaboost 演算法的文章中找到其演算法流程 我的疑問 1 第三步如何根據訓練資料訓練弱分類器?弱分類器的個數由什麼定,特徵維 數?2 第四步那個公式什麼意思?3 第七步如何歸一化?4 第八步怎麼理解?很多文章是這樣來介紹adaboos...

我對opensocia的一點l理解

我對opensocial的理解就是乙個開發者的開放平台,具體的說,是乙個應用到sns社群網的乙個第三方的api。它的使用者主要是針對開發者和sns社群 sns社群 根據opensocial 規則搭建乙個平台供開發者使用,開發者根據api在自己的作品做一定的修改,用來符合opensocial的規則,就...

我對補碼的理解

計算機中用補碼表示乙個數是為了方便運算的,這樣減法也可以通過加法來實現。為什麼這樣設計行呢?主要是因為計算機里數的特殊儲存格式決定的,計算機裡用固定位數表示乙個數,超過該位置的部分會被捨棄。拿8byte的int型來說,無符號形式下,最大到1111 1111 255,超過了該範圍,會被截斷的,如 11...