計算機中[1]和[-1]的趣事.

          首先感謝南老師!

          ??????在計算機里的有符號數(shù),最高位的1用來表示負號,所以,用 0000 0001表示正1,1000 0001表示-1,確實對人來說很直觀。但其實,計算機里的數(shù)是用“補碼”表示的。其中正數(shù)的補碼就是原來的數(shù)(稱為原碼),而負數(shù)的補碼是這么算的,我用倒推的來說:
          ??????補碼 = 反碼 + 1
          ??????反碼 = 原碼按位取反(1變0,0變1)
          ??????所以,-1就是1取補碼,過程如下:
          ??????先取反 0000 0001 ---> 1111 1110?
          ??????然后加1得補碼: 1111 1110 + 1 = 1111 1111?
          ????(當然這里為了方便,就取了8位,其實整數(shù)現(xiàn)在都是32位了,結(jié)果是32個1)。

          ?????現(xiàn)在,你知道如何計算-2了嗎? 為什么要搞反碼,補碼這么個轉(zhuǎn)換呢? 這個原因要說長就很長的,但簡單地講,這又是一個在人的直觀和機器的高效之間取一個平衡:
          ?????我們先來看一個10進制的數(shù)運算:
          ?????1 + (-1) = 0 //10進制中,1加負1應為0.
          ?????然后,假如用1000 0001來表示-1的話。按照計算機計算加法的規(guī)則,它是每位加的,結(jié)果是:
          ?????0000 0001 + 1000 0001 = 1000 0010??//-2
          ?????結(jié)果變成-2了,其中后面兩個0001 相加變成2,而前面的用于表示負號的1,被“繼承”下來了……顯然,原來計算機最直觀的(對人來說也很直觀的)算法,不靈了!怎么辦?痛苦

          ??? 但更痛苦的事還在0這個數(shù)上。按10進制,0和-0可是完全相等的。但如果用二進制,0000 0000 和 1000 0000 參加起運算,可是完全不同?;蛟S可以通過電路設計,來強制讓計算機去實現(xiàn)一個規(guī)則: 碰到1000 0000就先轉(zhuǎn)換為0000 0000。但可要知道加減法計算是計算機計算一切的基礎,如果從這最底層就必須有一個轉(zhuǎn)換會極大影響性能!何況前面那個問題也必須有個強制規(guī)則!規(guī)則最好越簡單越好,那就是規(guī)定前面的補碼轉(zhuǎn)換規(guī)則,這個轉(zhuǎn)換過程對于計算機來說很迅速的邏輯電路轉(zhuǎn)換。

          ??? 你看,第一個問題 1 + (-1)
          ? ? 0000 0001 + 1111 1111 = 0000 0000?
          ????看明白這個計算過程嗎?其實就是最低位的兩個1相加后,造成每一位都進位,最高位直接溢出(丟了)。如果你還算不清,就算算這個10進制的:
          ????1 + 999 =??1000 (最高位1丟失,就成0了)
          ????然后是第二個問題,0的表示。如果您把0當成正數(shù),那么它是這樣表示的:
          ????0000 0000
          ????如果你當它是負數(shù),那么
          ????取反 1111 1111 ,再加1,以求補 ,哈哈又成 0000 0000這回在邏輯上沒有錯誤了!明白了吧?當補我在學習這一段知識時,只能說:高,實在高! 想出補碼的前輩,真是高人啊。

          posted on 2006-09-20 20:59 Find it, try it, experience it 閱讀(244) 評論(0)  編輯  收藏


          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導航:
           
          <2006年9月>
          272829303112
          3456789
          10111213141516
          17181920212223
          24252627282930
          1234567

          導航

          統(tǒng)計

          公告

          If there is any question you have, please don't hesitate, let me know ASAP, you can find me at kenees@gmail.com or QQ: 9808873, hope to make friends with you ;)

          常用鏈接

          留言簿(1)

          隨筆檔案

          文章檔案

          搜索

          積分與排名

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 肇东市| 正宁县| 安新县| 山阴县| 肇州县| 遵义市| 中江县| 延庆县| 库伦旗| 泾源县| 磴口县| 巨野县| 吉首市| 德昌县| 宁海县| 沧源| 喜德县| 通化县| 建水县| 凤阳县| 老河口市| 慈溪市| 新邵县| 玉溪市| 彭水| 汤原县| 阿城市| 吉水县| 无锡市| 郸城县| 许昌市| 贞丰县| 云南省| 广水市| 喜德县| 盱眙县| 密山市| 水富县| 梅州市| 兴和县| 仁怀市|