<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                ## 一、引子 開始本章之前我先提個問題:“如果一個整數的絕對值等于它自己,那么這個數是幾?”如果你回答是 0 和 所有正數,那么請你耐心讀完這篇文章吧。 本章是我『代碼之謎』系列的第二篇,前一篇『[代碼之謎 - 開篇/前言/序](http://justjavac.com/codepuzzle/2012/09/25/codepuzzle-introduction.html)』簡單介紹了計算機與數學的不同。 數學中有許多復雜深刻的矛盾,數學家的工作就是解釋或者反駁這些矛盾, 例如有限與無限、連續與離散、存在與構造、邏輯與直觀、具體與抽象、概念與計算等等。 在本章中,我們把目標縮小,主要討論內容 * 概念: 有限與無限 * 對象: 8bit整數 ## 二、絕對值之謎 終于到主題了,也許你很想知道“負數的絕對值可能等于自己嗎?”,也就是 “如果x等于-x,那么x有幾個解?”按照我一貫的作風,我是不會輕易告訴你答案的。 《[編程珠璣](http://www.amazon.cn/gp/product/B001GNBZFE/ref=as_li_ss_tl?ie=UTF8&camp=536&creative=3132&creativeASIN=B001GNBZFE&linkCode=as2&tag=justjavac-23)》記載,作者告訴了他同事一個結果,而不是方法,最后追悔莫及。 所以,我在這里要**告訴你方法,而不是告訴你答案**。 告訴你答案之前,首先得回答個問題:“整數(8bit)的表示范圍是多少?”,(也許你已經把教科書的知識背下來了,是 -2^7 到 2^7 - 1,也就是 -128 到 +127,現在的計算機科學都快成為文科了 ^_^ )。 如果你不知道也沒關系,至少你知道 8bit 可以表示的整數個數是 2^8 個,這個數等于多少無所謂,但是,它一定是個偶數(256)。 那么這里就有一個很有意思的問題了,0既不是正數也不是負數,把0去掉的話,整數的個數就是奇數了,整數還剩 255 個。 奇數個整數不可能平均分成兩部分(正數和負數),要么負數多一個,要么正數多一個。事實就是,負數比正數多一個,最小的負數是 -128, 最大的整數是 127。 現在的問題是, -128 的絕對值是多少呢? -(-128)等于多少呢?是溢出呢,還是等于它自己呢?也許計算機課本沒有告訴你,?**整數是不會出現溢出異常的**,整數的溢出被認為是正常的舍棄(其實只要很合理)。**整數只有被0除才會異常,而浮點數,即使被0除也不會拋出異常**。 浮點數除0的操作將放在本系列浮點數篇討論。 **絕對值等于自己的數有兩個,0 和最小的負數。** 你可能要像香港電影里女主角那樣歇斯底里的大喊“絕對值怎么可能是負數呢? 不可能,我不信,我不信…” 忘掉你那可憐的數學知識吧,“發生這種事,大家都不想的。感情的事呢,是不能強求的。所謂吉人自有天相,做人呢,最要緊的就是開心…”跑題了,趕緊回來。 在經典數學(非皮亞諾算術系統,皮亞諾絕對是歐幾里德的鐵桿粉絲,要不怎么會有如此天才的構想,這個以后會給大家普及)中,絕對值定義為:“從原點到點A的距離,稱為A的絕對值,它是一個非負數”。 既然講到了距離,不妨劇透一下(本系列“邏輯篇”會涉及到),兩個數的大小在數學中如何定義,“距離數軸原點的距離遠近”,計算機中大小如何定義的呢?給大家留個作業吧(別告訴我是設計編程語言或者設計電腦的科學家規定的,計算機科學絕對不是文科)。 計算機中沒有數軸,絕對值是如何定義的呢?看看java、C、Python的源碼(感謝那些開源大牛),和咱們學的小學數學一樣。 ~~~ abs(x) := (x >= 0) ? x : -x ~~~ 翻譯過來就是,x的絕對值定義為:正數和0的絕對值等于它自己,負數的絕對值等于-x。(這里使用的是-x,而沒有用0-x,因為在浮點數中,這兩者是有區別的。) ## 三、深入 -x 那么 -x 是如何計算的呢??**計算**是數學概念,在計算機中,我們應該說 -x是如何**求值**的呢?還得回到源碼,我只看了linux中關于C的源碼,如果你看過其它語言源碼發現和我說的不同,請聯系我。 學過計算機原理的都知道,負數在計算機中以補碼形式存儲,計算補碼的方式和取反操作類似。 ~~~ 符號位不變,其它位取反,最后加一。 ~~~ 比如 -5 ~~~ 原碼: 1000,0101 其它位取反: 1111,1010 加一: 1111,1011 ~~~ 當我們求它的絕對值時如何操作呢 ~~~ 補碼: 1111,1011 這是-5在計算機中的表示 各位取反: 0000,0100 加一: 0000,0101 此時結果為+5 ~~~ 現在我們回到最小的負數問題,最小的負數在計算機中表示為 1000,000,下面我們對這個數操作 ~~~ 補碼: 1000,0000 各位取反: 0111,1111 加一: 1000,0000 ~~~ 神奇嗎,尼瑪,居然又回到自己了。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看