之前一直很疑惑一個問題,為什麼一個Byte可以表示的範圍是:-128~127,因為明明有一位是符號位。0111 1111這個表示127可以理解,因為最高位是符號位。而前面的和是127,然而聽老師講解的時候,127加1是負128,我在想為什麼是這樣子? 因為:明明127加1的結果是:1000 0000這個明顯表示0啊。最高位是符號位,後面全是0,所以-0等於0. 首先先給出一個答案,一般的書上應該都是這麼給的:在計算機中,數字都是用補碼來儲存的,而一個位元組的數字,規定1000 0000就是-128,然後這裡又來了一個疑問,為什麼要這麼規定?這麼規定的好處是什麼?會不會讓人產生誤解,因為明明這個二進位制就是0,1000 0000,(最高位表示符號,其餘位都是0) 如果對於問題的理解,僅僅停留在上面的層次,最多也只是理解了正數怎麼表示,負數怎麼表示。一個位元組表示的最大範圍和最小範圍分別是什麼?然後對上面那個容易產生歧義的問題也有了一個記憶性的瞭解。但是,僅僅是知其然,而不知其所以然。如果這時候可以保持充分的好奇心,深挖一下其中的知識,自己的瞭解和領悟就會加深很多。困難的道路會越走越容易。 為了解答一下上面的問題,就必須弄明白幾個基本概念:原碼,反碼,和補碼。然後這幾個基本概念的引入也有著其深刻的背景。 首先,什麼是原碼?原碼就是我們所理解的二進位制碼。比如1,就是:0000 0001,最高位表示符號位正。那麼負1怎麼表示呢?就是:1000 0001,最高位表示符號位負。 然後其他數,以此類推。 那麼這裡我們會發現一個有趣的現象,一個位元組,八個位。能表示的最小的數字其實是-127,即:1111 1111,那麼為什麼老師講的時候,會說其實可以表示的數字是:-128,而1000 0000會表示-128呢?那是因為這裡的1000 0000 其實是用補碼來表示的。也就是說用原碼的話,一個位元組可以表示的範圍是:-127~127,用補碼的話表示的範圍是:-128~128.這裡又會有人要問,為什麼呢? 嗯,覺得可以順利成章引入補碼的概念了,雖然上面的小問題不足以給我們充分的理由引入補碼,但是作為引入補碼的一個小彩蛋也應該已經足夠了。 引入一下補碼吧,順便把反碼引入進來。因為反碼是溝通原碼和補碼的一個橋樑。分兩種情況,對於正數來說原碼,反碼,補碼都是一樣的。對於負數來說,反碼是原碼的符號位不變,其餘各位取反。比如:-1的原碼:1000 0001 反碼:1111 1110 補碼:1111 1111.嗯,現在對什麼是原碼,什麼是反碼,什麼是補碼有了一個最基本的概念性的瞭解了。如果作為一個簡單的講解,其實這裡已經足夠了。但是,我們還是有一個疑問,為什麼?難道僅僅是為了規定一個-128多了一位嗎?而且為什麼這樣也沒有說清楚。 下面講一下為什麼要引入反碼,補碼。 從人類的角度來看,前面那個符號位是很容易理解的。可是在計算機裡面去理解,就會發生混亂。我們來看一個很簡單的例子:(這裡我們把減去一個數規定為加上這個數的相反數,應該不難理解。這樣就可以把減法當做加法來算。應該初中已經接觸過了這樣的概念) 我們來看:1+(-1)的值。 原碼錶示:0000 0001 + 1000 0001= 1000 0010 。發現出現了一個混亂,這個值明明是-2哎,而不是這個:0000 0000。所以如果用原碼錶示,以為著符號位也會參與運算。這就會出現錯誤,這應該就是在計算機內部不採用原碼的方式來儲存和運算資料的原因。 那怎麼辦呢?換個思路試試看。用反碼的方式: 反碼錶示:1+(-1) 0000 0001 + 1111 1110 = 1111 1111 這個反碼的原碼是:1000 0000 ,嗯,正好等於0. 於是好像沒有問題了,不過還是有一個問題。因為0000 0000 這個數也表示0 呀,在計算機內有兩個數都表示0,是一件比較危險的事情。怎麼辦呢? 用補碼試試看。 補碼錶示:1+(-1) 0000 0001 + 1111 1111= 0000 0000 這個補碼的原碼是:0000 0000 所以唯一性的問題就解決了,而且原來那個數字,就被規定為:-128.即:這個補碼形式的:1000 0000 他其實是-1 的反碼,所以它不能用我們原來的規則去求反碼,原碼。而只是多了一個二進位制碼,我們規定為-128.可以理解成廢物利用吧。 所以用補碼錶示的時候,最低可以表示到-128. 嗯,到此為止就把為什麼一個位元組可以表示最小數字為:-128。 初步講明白了。 其實還有幾個問題, 1.反碼和補碼是怎麼想出來的? 2.你只驗證了1+(-1),補碼是不是對其它情況都滿足運算的規則而不會產生錯誤呢?(答案是符合的) 這兩個問題,現在實力所限現在還回答不了。以後慢慢學到了這方面知識有機會去回答。不過這篇文章主要是想透過一個問題,引入:原碼,反碼,和補碼,以及應該注意的一些問題。覺得目的應該已經達到。 嗯,知其所以然
之前一直很疑惑一個問題,為什麼一個Byte可以表示的範圍是:-128~127,因為明明有一位是符號位。0111 1111這個表示127可以理解,因為最高位是符號位。而前面的和是127,然而聽老師講解的時候,127加1是負128,我在想為什麼是這樣子? 因為:明明127加1的結果是:1000 0000這個明顯表示0啊。最高位是符號位,後面全是0,所以-0等於0. 首先先給出一個答案,一般的書上應該都是這麼給的:在計算機中,數字都是用補碼來儲存的,而一個位元組的數字,規定1000 0000就是-128,然後這裡又來了一個疑問,為什麼要這麼規定?這麼規定的好處是什麼?會不會讓人產生誤解,因為明明這個二進位制就是0,1000 0000,(最高位表示符號,其餘位都是0) 如果對於問題的理解,僅僅停留在上面的層次,最多也只是理解了正數怎麼表示,負數怎麼表示。一個位元組表示的最大範圍和最小範圍分別是什麼?然後對上面那個容易產生歧義的問題也有了一個記憶性的瞭解。但是,僅僅是知其然,而不知其所以然。如果這時候可以保持充分的好奇心,深挖一下其中的知識,自己的瞭解和領悟就會加深很多。困難的道路會越走越容易。 為了解答一下上面的問題,就必須弄明白幾個基本概念:原碼,反碼,和補碼。然後這幾個基本概念的引入也有著其深刻的背景。 首先,什麼是原碼?原碼就是我們所理解的二進位制碼。比如1,就是:0000 0001,最高位表示符號位正。那麼負1怎麼表示呢?就是:1000 0001,最高位表示符號位負。 然後其他數,以此類推。 那麼這裡我們會發現一個有趣的現象,一個位元組,八個位。能表示的最小的數字其實是-127,即:1111 1111,那麼為什麼老師講的時候,會說其實可以表示的數字是:-128,而1000 0000會表示-128呢?那是因為這裡的1000 0000 其實是用補碼來表示的。也就是說用原碼的話,一個位元組可以表示的範圍是:-127~127,用補碼的話表示的範圍是:-128~128.這裡又會有人要問,為什麼呢? 嗯,覺得可以順利成章引入補碼的概念了,雖然上面的小問題不足以給我們充分的理由引入補碼,但是作為引入補碼的一個小彩蛋也應該已經足夠了。 引入一下補碼吧,順便把反碼引入進來。因為反碼是溝通原碼和補碼的一個橋樑。分兩種情況,對於正數來說原碼,反碼,補碼都是一樣的。對於負數來說,反碼是原碼的符號位不變,其餘各位取反。比如:-1的原碼:1000 0001 反碼:1111 1110 補碼:1111 1111.嗯,現在對什麼是原碼,什麼是反碼,什麼是補碼有了一個最基本的概念性的瞭解了。如果作為一個簡單的講解,其實這裡已經足夠了。但是,我們還是有一個疑問,為什麼?難道僅僅是為了規定一個-128多了一位嗎?而且為什麼這樣也沒有說清楚。 下面講一下為什麼要引入反碼,補碼。 從人類的角度來看,前面那個符號位是很容易理解的。可是在計算機裡面去理解,就會發生混亂。我們來看一個很簡單的例子:(這裡我們把減去一個數規定為加上這個數的相反數,應該不難理解。這樣就可以把減法當做加法來算。應該初中已經接觸過了這樣的概念) 我們來看:1+(-1)的值。 原碼錶示:0000 0001 + 1000 0001= 1000 0010 。發現出現了一個混亂,這個值明明是-2哎,而不是這個:0000 0000。所以如果用原碼錶示,以為著符號位也會參與運算。這就會出現錯誤,這應該就是在計算機內部不採用原碼的方式來儲存和運算資料的原因。 那怎麼辦呢?換個思路試試看。用反碼的方式: 反碼錶示:1+(-1) 0000 0001 + 1111 1110 = 1111 1111 這個反碼的原碼是:1000 0000 ,嗯,正好等於0. 於是好像沒有問題了,不過還是有一個問題。因為0000 0000 這個數也表示0 呀,在計算機內有兩個數都表示0,是一件比較危險的事情。怎麼辦呢? 用補碼試試看。 補碼錶示:1+(-1) 0000 0001 + 1111 1111= 0000 0000 這個補碼的原碼是:0000 0000 所以唯一性的問題就解決了,而且原來那個數字,就被規定為:-128.即:這個補碼形式的:1000 0000 他其實是-1 的反碼,所以它不能用我們原來的規則去求反碼,原碼。而只是多了一個二進位制碼,我們規定為-128.可以理解成廢物利用吧。 所以用補碼錶示的時候,最低可以表示到-128. 嗯,到此為止就把為什麼一個位元組可以表示最小數字為:-128。 初步講明白了。 其實還有幾個問題, 1.反碼和補碼是怎麼想出來的? 2.你只驗證了1+(-1),補碼是不是對其它情況都滿足運算的規則而不會產生錯誤呢?(答案是符合的) 這兩個問題,現在實力所限現在還回答不了。以後慢慢學到了這方面知識有機會去回答。不過這篇文章主要是想透過一個問題,引入:原碼,反碼,和補碼,以及應該注意的一些問題。覺得目的應該已經達到。 嗯,知其所以然