国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

【轉載】代碼之謎(一)- 有限與無限(從整數的絕對值說起)

2019-11-08 18:49:15
字體:
來源:轉載
供稿:網友

本博客為轉載,原博客作者為justjava鏈接:http://justjavac.iteye.com/blog/1698691

一、引子

開始本章之前我先提個問題:“如果一個整數的絕對值等于它自己,那么這個數是幾?”如果你回答是 0 和 所有正數,那么請你耐心讀完這篇文章吧。

本章是我『代碼之謎』系列的第二篇,前一篇『代碼之謎 - 開篇/前言/序』簡單介紹了計算機與數學的不同。

數學中有許多復雜深刻的矛盾,數學家的工作就是解釋或者反駁這些矛盾, 例如有限與無限、連續與離散、存在與構造、邏輯與直觀、具體與抽象、概念與計算等等。

在本章中,我們把目標縮小,主要討論內容

概念: 有限與無限對象: 8bit整數

二、絕對值之謎

終于到主題了,也許你很想知道“負數的絕對值可能等于自己嗎?”,也就是 “如果x等于-x,那么x有幾個解?”按照我一貫的作風,我是不會輕易告訴你答案的。 《編程珠璣》記載,作者告訴了他同事一個結果,而不是方法,最后追悔莫及。 所以,我在這里要告訴你方法,而不是告訴你答案

告訴你答案之前,首先得回答個問題:“整數(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

神奇嗎,尼瑪,居然又回到自己了。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 满洲里市| 寿阳县| 贵阳市| 沁水县| 富宁县| 桑植县| 塘沽区| 南昌县| 阜康市| 武强县| 肇州县| 揭东县| 溧水县| 滦南县| 江孜县| 武城县| 广西| 光山县| 敦化市| 灵丘县| 淮滨县| 大冶市| 东兴市| 衡水市| 南平市| 宁乡县| 洪雅县| 花垣县| 高州市| 卓资县| 衡水市| 夹江县| 龙门县| 漾濞| 余干县| 禹城市| 根河市| 温宿县| 中阳县| 玉门市| 武山县|