<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      標簽列表

      everest33

      自制力

      導航

      原碼、反碼、補碼的產生、應用以及優缺點有哪些?

      第一篇:(受益匪淺)

      原碼:將一個整數,轉換成二進制,就是其原碼。
      如單字節的5的原碼為:0000 0101;-5的原碼為1000 0101。

       反碼:正數的反碼就是其原碼;負數的反碼是將原碼中,除符號位以外,每一位取反。
      如單字節的5的反碼為:0000 0101;-5的反碼為1111 1010。

       補碼:正數的補碼就是其原碼;負數的反碼+1就是補碼。
      如單字節的5的補碼為:0000 0101;-5的補碼為1111 1011。

        在計算機中,正數是直接用原碼表示的,如單字節5,在計算機中就表示為:0000 0101。
      負數用補碼表示,如單字節-5,在計算機中表示為1111 1011。

      這兒就有一個問題,為什么在計算機中,負數用補碼表示呢?為什么不直接用原碼表示?如單字節-5:1000 0101。
        
      我想從軟件上考慮,原因有兩個

       1、表示范圍
        拿單字節整數來說,無符號型,其表示范圍是[0,255],總共表示了256個數據。有符號型,其表示范圍是[-128,127]。
        先看無符號,0表示為0000 0000,255表示為1111 1111,剛好滿足了要求,可以表示256個數據。
        再看有符號的,若是用原碼表示,0表示為0000 000。因為咱們有符號,所以應該也有個負0(雖然它還是0):1000 0000。

        那我們看看這樣還能夠滿足我們的要求,表示256個數據么?
        正數,沒問題,127是0111 1111,1是0000 0001,當然其它的應該也沒有問題。
        負數呢,-1是1000 0001,那么把負號去掉,最大的數是111 1111,也就是127,所以負數中最小能表示的數據是-127。
        這樣似乎不太對勁,該如何去表示-128?貌似直接用原碼無法表示,而我們卻有兩個0。
        如果我們把其中的一個0指定為-128,不行么?這也是一個想法,不過有兩個問題:一是它與-127的跨度過大;二是在用硬件進行運算時不方便。
        所以,計算機中,負數是采用補碼表示。
      如 單字節-1,原碼為1000 0001,反碼為1111 1110,補碼為1111 1111,計算機中的單字節-1就表示為1111 1111。

        單字節-127,原碼是1111 1111,反碼1000 0000,補碼是1000 0001,計算機中單字節-127表示為1000 0001。
        
      單字節-128,原碼貌似表示不出來,除了符號為,最大的數只能是127了,其在計算機中的表示為1000 0000。

        2、大小的習慣(個人觀點)
        也可以從數據大小上來理解。還是以單字節數據為例。有符號數中,正數的范圍是[1,127],最大的是127,不考慮符號為,其表示為111 1111;最小的是1,不考慮符號為,其表示為000 0001。
        負數中,最大的是-1,我們就用111 1111表示其數值部分。后面的數據依次減1。減到000 0001的時候,我們用它標示了-127。再減去1,就變成000 0000了。還好我們有符號位,所以有兩個0。把其中帶符號的0拿過來,表示-128,剛好可以滿足表示范圍[由此可見-128實際上就是-0]。

      計算機中的1000 0000可以表示無符號的128,也可以表示有符號的-128(-0).

        以上只是從軟件的角度進行了分析,當然,從硬件的角度出發,負數使用補碼表示也是有其原因的,畢竟計算機中,最終實現運算的還是硬件。
      主要原因有三
        1>、負數的補碼,與其對應正數的補碼之間的轉換可以用同一種方法----求補運算完成,簡化硬件。
        如[注:無論正數還是負數,將其在計算機中存儲的方式視為原碼]

       
      From To 原碼 反碼[所有位取反] 補碼
      -127 127 1000 0001 0111 1110 0111 1111
      127 -127 0111 1111 1000 0000 1000 0001
      -128 128 1000 0000 0111 1111 1000 0000
      128 -128 1000 0000 0111 1111 1000 0000


        可以發現,負數和正數求補的方法是一樣的。

        2>、可以將減法變為加法,省去了減法器。
        在計算機中,我們可以看到,對其求補,得到的結果是其數值對應的負數。同樣,負數也是如此。
        運算中,減去一個數,等于加上它的相反數,這個小學就學過了。既然其補碼就是其相反數,我們加上其補碼不就可以了。
        如:A - 127,
        也就相當于:A + (-127),
        又因為負數是以補碼的形式保存的,也就是負數的真值是補碼,既然這樣,當我們要減一個數時,直接把其補碼拿過來,加一下,就OK了,我們也可以放心地跟減法說拜拜了!
        當然這也涉及到類型轉換的問題,如單字節128,其原碼是1000 0000,其補碼也是1000 0000。這樣我們+128,或者-128,都是拿1000 0000 過來相加,這樣不混亂掉了?還好,各個編程語言的編輯器對有類型轉換相關的限制。
        如:(假設常量都是單字節)
      + 128, 真值的運算是 0000 0001 + 1000 0000 ,如果你將結果賦值給一個單字節有符號正數,編輯器會提示你超出了表示范圍。因為運算的兩個數據是無符號的,其結果也是無符號的129,而有符號單字節變量最大可以表示的是127。
      - 128,真值的運算是 0000 0001 + 1000 0000 ,因為-128是有符號,其運算結果也是有符號,1000 0001,剛好是-127在計算機中的真值。

        3>、無符號及帶符號的加法運算可以用同一電路完成。
        有符號和無符號的加減,其實都是把它們的真值拿過來相加。真值,也就是一個數值在計算機中的二進制表示。正數的真值就是其原碼,負數的真值是其補碼。所以,有符號和無符號由編譯器控制,計算機要做的不過是把兩個真值拿過來相加。





      第二篇
      作者:張天行
      鏈接:https://www.zhihu.com/question/20159860/answer/119405396
      來源:知乎
      著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。

      二、重溫運算規則

      首先我想把整套關于原碼反碼補碼的運算規則準確清晰地寫一遍,方便急需應用的知友參考,也希望大家首先能記住這套規定,再開始進一步的探討。

      所謂原碼就是機器數,是加了一位符號位的二進制數,正數符號位為0,負數符號位為1,計算機中存儲、處理、運算的數據通常是8位、16位、32位或64位的,這里以最簡單的8位為例講解。注意符號位是包含在8位中的其中1位,故可直觀讀出的數只有7位(只有后7位數可以按權展開)。有心人可能注意到原碼是有缺陷的,它只能表示255種狀態,因為00000000(+0)和10000000(-0)其實是一個數,因此原碼的表示范圍成了-127到+127,這個問題需要神奇的補碼來解決,因為在補碼中10000000被用來表示-128。

      【自注: +0 ,-0原碼和反碼都各自有一個,但是兩者的補碼都一樣,都是 0000 0000 】

      所謂反碼,英語里又叫ones' complement(對1求補),這里的1,本質上是一個有限位計數系統里所能表示出的最大值,在8位二進制里就是11111111,在1位十進制里就是9,在3位十六進制里就是FFF(再大就要進位了)。求反又被稱為對一求補,用最大數減去一個數就能得到它的反,很容易看出在二進制里11111111減去任何數結果都是把這個數按位取反,0變1,1變零,所以才稱之為反碼。用原碼求反碼的方法是,正數不變,負數保留符號位1不變,剩下位按位取反。

      所謂補碼,英語里又叫two's complement(對2求補),這個2指的是計數系統的容量(模),就是計數系統所能表示的狀態數。對1位二進制數來說只有0和1兩種狀態,所以模是10也就是十進制的2,對7位二進制數來說就是10000000,這個模是不可能取到的,因為位數多一位。用模減去一個數(無符號部分)就能得到這個數的補,比如10000000-1010010=0101110,事實上因為10000000=1111111+1,稍加改變就成了(1111111-1010010)+1,所以又可以表述為先求反再加1??偨Y求補碼的方法就是正數依舊不變,負數保留符號位不變,先求反碼再加上1。

      記住了怎么求補碼,接下來講講運算。通過原碼的符號位和數值,我們能迅速指出它代表的數,判斷其正負并進行四則運算,相比而言反碼和補碼對于人則顯得過于晦澀。如果說原碼是給人看的數字語言,那么補碼就是計算機的數字語言。計算機不需要知道什么是正負、大小,這些判斷對它而言過于復雜。事實上它存儲、處理、傳輸的數都只有補碼一種形式,人所做的加減乘除,在計算機里只通過相加和移位就能解決,這都來自于補碼系統的內在自洽和巧奪天工的神奇魔力,也是后文要闡述的重點。

      對加法和減法,按上文的方法求得補碼之后,直接相加就可以了,但相加的時候符號位一定要一起參與運算,有時候,兩符號位相加或者接受來自低位的進位會發生溢出,就扔掉溢出的一位(稍后會解釋為什么),由新的符號位決定結果的正負,如果是0表示正數,結果就是原碼,如果是1表示負數,結果還要再求補數得到原碼(   補碼再補碼就是原碼,即原碼和補碼互為補碼,兩者互換的方法都有兩種[對負數來講],符號位不變,其他位取反再加1;②符號位不變,先減 1然后其他位取反,  )。

      至此我介紹了原碼反碼補碼的規定,以及如何求補碼并進行加減法(乘除暫不涉及,事實上懂了加減法的奧秘,乘除很容易理解),對于一個工程人才來說,上面的內容已經足夠應付所有具體問題。剩下的則是一些“無用”的思考,關于為何這套法則能夠化減為加,以及人為規定的符號位在運算中為何總是能精確地指示結果的符號。

      三、無用之用

      數字是用來記錄現實世界數量屬性的語言。

      而任何計數系統都必須有兩個參數:容量精度

      是衡量計數系統容量的參數。模代表了計數系統所能表示和存儲的狀態數。

      任何有限的計數系統都有一個確定的模。如時鐘的模是12(即只有一個位的十二進制系統,若再加一個大鐘,使小鐘轉一周大鐘加一刻度,就是有兩個位的十二進制系統),再比如8位計算機的模是2^8=256D(每一位也可以單獨看做一個模為2的計數系統)。

      問題一:化減為加

      對同一計數系統中的數量可以定義運算如加減,但運算結果超出預設位數時,就要發生溢出,這個溢出其實就是模,是時鐘的一整圈(因此丟掉它沒有影響),如果進位沒有被另一個計數系統接受,結果看似“失真”,本質上是進入了“第二次循環”。
      以時鐘系統為例:8+7=15D=13(十二進制)>10(十二進制),進位1溢出丟失(除非用另一個時鐘接收這個進位),在表盤上(即一位十二進制計數系統中)呈現為3,而8-5=8+(-5)=3也得到了相同結果。這就說明在有限容量的計數系統中,+7和-5是完全相同的,而它們正是關于模12的一對補數。

      因此我們在有限的計數系統做了這種定義:正數補數即為本身,負數A【補】=模-絕對值(A)。一個數加上另一個數(可以是正數也可以是負數),結果等于加上這個數的補數,若有進位則舍棄進位。這么做的重大意義在于極大地方便了計算機進行數據處理,要知道對人而言減法并非難事,但用門電路實現就復雜得多了,減之前還要判斷大小考慮次序。

      問題二:符號位參與運算

      在8位計算機中,一個字節可以表示256種狀態,把字節看做一個鐘的話,刻度可以隨便標,不如取0點鐘為-128,正對的6點鐘為0,即存儲范圍是從-128到127,用二進制補碼表示是10000000~01111111(10000000用來表示-128似乎是人為定義的,因為原碼無法表示-128,按正常程序更無法求得其補碼)。

      符號位是我認為理解補碼的關鍵所在,也是關于補碼最神奇的地方。人類“生硬”地添加了符號位,把256種狀態剪成正負兩半,還“生硬”地規定-128的補碼為10000000,但用補碼運算的時候,一切就像“水往低處流”般正確和諧自然:符號位參與運算,接受來自低位的進位,永遠能忠實地指示結果的正負。

      我舉個例子,你們感受一下:

      所謂的“負數加負數會變成正數,正數加正數會變成負數”,本質還是在于,計數系統是無法表示超出其取值范圍的計算結果的。

      120D+120D=01111000B+01111000B=11110000B,符號位的1來自低位進位,指示了結果是負數,所以需要求補得10010000B也就是-16D,放在鐘面上就是從120順時針旋轉120格到240的位置,只不過系統最大只取到127,240的位置就是-16的位置,而且-16和240正是關于模256的一對補數。-120D-120D=16D也是一樣的道理。在有限的計數系統內,由于位數的限制,發生溢出的情況下無法得到計算真實值,得到的是真實值關于模的補數。

      看到這里是不是有那么點味道呢,我給你們總結一下:加法都是從低位往高位做的,如果兩個數(補碼),后七位相加產生了進位,說明
      又溢出了一次,每當溢出一次(就是越過了-128這個正負分界點),符號就要反一下,0變1,1變0。符號是1的,說明大得越界了,需要再求個補,用取值范圍內的負數表示結果;符號是0的,說明小得越界了,但由于正數的補數就是本身,就不必再求補了。

      四、后記

      從八月底的初稿到這篇文章,中間經歷了差不多四個月的時間,我對于補碼問題的認識也經歷了困惑到清晰到困惑到再清晰這一過程,其中修改超過十次,思考所花的時間更是不計其數。從參加考試的角度看,我熟記的運算規則早已足夠我應付所有題目,但我仍然不愿意半途而廢,原因有二:

      大一學習線性代數時,曾經掛過科,因為對于定理和公式背后的含義一無所知,而老師也不加講解,只一味讓我們死記做題。雖然很多同學都適應這種所謂的“工科數學學習”,然而這對我而言簡直如同夢魘,沒有理解內化如何能稱得上學習,不過是應付考試然后忘的精光罷了。我很幸運的是,在準備補考時讀到了網上廣為流傳的孟巖老師的文章《理解矩陣》,我記得那是一個冬天的晚上,讀完文章后我很興奮,一直到半夜都睡不著,這是我第一次體會到數學體系的和諧自洽以及數學的深刻性在工程中的巨大威力,從那以后我才逐漸找到了學習數學的樂趣。

      《理解矩陣》中有一段話至今我還記得,現摘抄如下:
      自從1930年代法國布爾巴基學派興起以來,數學的公理化、系統性描述已經獲得巨大的成功,這使得我們接受的數學教育在嚴謹性上大大提高。然而數學公理化的一個備受爭議的副作用,就是一般數學教育中直覺性的喪失。數學家們似乎認為直覺性與抽象性是矛盾的,因此毫不猶豫地犧牲掉前者。然而包括我本人在內的很多人都對此表示懷疑,我們不認為直覺性與抽象性一定相互矛盾,特別是在數學教育中和數學教材中,幫助學生建立直覺,有助于它們理解那些抽象的概念,進而理解數學的本質。反之,如果一味注重形式上的嚴格性,學生就好像被迫進行鉆火圈表演的小白鼠一樣,變成枯燥的規則的奴隸。

      “枯燥的規則的奴隸”又何止是在數學教學中出現的呢?如果你在大學工科學習過,你會發現這些人簡直遍地都是,拿我在的浙大為例,有的是學生對課程并不理解,單靠考前突擊刷題就拿到90分以上的成績。

      正是在這樣的情形下,我決定盡我所能重新思考學到的每一個重要知識,并將其中一部分寫成文章,一來有助于對思維的梳理,二來也是便于自己將來的回顧,倘若拙作還能對他人也有所幫助,從而使我給世界留下一些微不足道的影響,那真是幸甚了。

      posted on 2017-03-20 10:14  everest33  閱讀(9814)  評論(2)    收藏  舉報

      主站蜘蛛池模板: 亚洲老女人区一区二视频| 国产亚洲av夜间福利香蕉149 | 国产精品亚洲二区亚瑟| 日韩美av一区二区三区| 免费av深夜在线观看 | 一区二区三区人妻无码| 巫山县| 久久精品免视看国产成人| 在国产线视频A在线视频| 男女一边摸一边做爽爽| 久9re热视频这里只有精品免费| 久久国产精99精产国高潮| 狠狠色丁香婷婷综合尤物| 波多野结衣久久一区二区| 亚洲尤码不卡av麻豆| 91人妻熟妇在线视频| 欧美日韩免费专区在线观看 | 国产成人午夜福利在线播放| 保定市| 欧美成人h亚洲综合在线观看| 天堂网av成人在线观看| 国产成人精品无人区一区| 在线无码免费的毛片视频| 日韩一区二区三区一级片| 亚洲综合高清一区二区三区| 亚洲高清WWW色好看美女| 中文字幕一区二区三区麻豆| 狠狠亚洲色一日本高清色| 中文字幕无线码免费人妻| 最新国产精品亚洲| 91中文字幕在线一区| 少妇高潮激情一区二区三| 精品国产一区二区在线视| 日韩中文字幕v亚洲中文字幕| 国产特级毛片aaaaaa高清| 欧美日韩不卡视频合集| 真实国产老熟女无套中出| 一区二区三区四区五区色| 日韩免费无码视频一区二区三区 | 一区二区亚洲人妻av| 久久天天躁夜夜躁一区|