摘錄:來自justjavac(迷渡)——代碼之謎


第一章:ide

C中爲何能夠i = i + 1?由於=是賦值,注意這只是在大部分語言中這樣,好比ST語言就是:=。因而既然=若是不是相等的話,那確定有表示相等的,好比==或者===。無論是==仍是=,「相等」究竟是什麼意思呢?=或者==或者===,即便之後會出現====,到底和數學的「相等」有多少出入呢?spa

NaN(通常表示Not A Number),NaN是在IEEE浮點數規範中明肯定義的,包括本系列後面 後提到的+0和-0問題),它不等於任何值,並且,它竟然不等於它本身。翻譯

一個數竟然不等於它本身,其實確切的說,是 NaN == NaN 竟然返回 false, 甚至 NaN === NaN 也返回 false。是NaN 的問題,仍是==或者===的問題,抑或這根本就是相等這個概念的問題。數學

在集合論中,相等的三要素,無論是==仍是===,都沒法知足,因此說,===根本就不是相等(若是你讀過數學的「羣倫」就更明白了)。it

相等(等價)的三要素class

1. 自檢討: A等於A原理

2. 對稱性: 若是A等於B,那麼B等於Aim

3. 傳遞性: 若是A等於B,並且B等於C,那麼A等於C異常


說通俗一點,之前的全部定理、公理都只適用於一個領域,當它進入另外一個領域咱們就不能把它看成理所固然的,也許它沒有問題,好比1+2=3,但也許這只是一個巧合, 上面我就提到了 0.2+0.4 就不等於 0.6。計算機

計算機和現實最大的不一樣(也是問題的根源)就是,世界是連續的,而計算機是非連續的,是離散的。


第二章:

整數(8bit)的表示範圍是多少?」,(也許你已經把教科書的知識背下來了,是 -2^7 到 2^7 - 1,也就是 -128 到 +127。那麼這裏就有一個頗有意思的問題了,0既不是正數也不是負數,把0去掉的話,整數的個數就是奇數了,整數還剩255 個。 奇數個整數不可能平均分紅兩部分(正數和負數),要麼負數多一個,要麼正數多一個。事實就是,負數比正數多一個,最小的負數是 -128, 最大的整數是 127。


如今的問題是, -128 的絕對值是多少呢? -(-128)等於多少呢?是溢出呢,仍是等於它本身呢?也許計算機課本沒有告訴你, 整數是不會出現溢出異常的,整數的溢出被認爲是正常的捨棄(其實只要很合理)。整數只有被0除才會異常,而浮點數,即便被0除也不會拋出異常。

絕對值等於本身的數有兩個,0 和最小的負數。


在經典數學中,絕對值定義爲:「從原點到點A的距離,稱爲A的絕對值,它是一個非負數」。兩個數的大小在數學中如何定義,「距離數軸原點的距離遠近」,計算機中大小如何定義的呢?abs(x) := (x >= 0) ? x : -x   翻譯過來就是,x的絕對值定義爲:正數和0的絕對值等於它本身,負數的絕對值等於-x。(這裏使用的是-x,而沒有用0-x,由於在浮點數中,這二者是有區別的。)


-x 是如何計算的呢?學過計算機原理的都知道,負數在計算機中以補碼形式存儲,計算補碼的方式和取反操做相似。符號位不變,其它位取反,最後加一。


最小的負數在計算機中表示爲 1000,000,下面咱們對這個數操做

補碼: 1000,0000

各位取反: 0111,1111

加一: 1000,0000

神奇嗎,尼瑪,竟然又回到本身了。

相關文章
相關標籤/搜索