計算機是一個很神奇的東西,僅靠 0 和 1 就能運算、存儲等操作。那么,為什么Byte是從是從-128到127?
今天就給大家講講計算機二進制的一些內容。
1
計算機表示數據的規則這個問題的解釋要從符號位說起,在計算機的世界里,數字的表示采用的是二進制的規則,如果自然界只存在正數,那么計算機的編碼方式將無比簡單,直接就能使用二進制來表示。比如十進制的8,直接就用1000表示就可以。
但是自然界還存在負數,在現實社會中我們使用正號和負號來表示,但是對于計算機來說,要添加正號和負號不是那么容易的事情,會帶來電路復雜度成倍的上升。
于是,所謂的符號位出現了,采用最高位來表示符號位,0為正數,1為負數。我覺得本質上符號位就是為了解決計算機如何表示負數而出現的。
2
原碼、反碼、補碼
有了正數和負數,下面說說運算的問題,根據馮諾依曼計算機體系得知,一臺計算機由運算器,控制器,存儲器,輸入輸出設備組成,其中運算器只有加法運算器(其他的運算全部轉換成加法運算來完成),所以呢,計算機世界的減法只能用加法表示。
比如:4-2 只能用4+(-2)運算。
1.原碼-2怎么表示?最直觀的表示方法表示為1010,最高位是符號位。這樣的表示方式,我們稱為原碼表示法。然后我們就愉快的開始了運算。
4-2=0100+1010=1110=-62-2=0010+1010=1100=-4
很明顯結果是不對的,所以不能用原碼來表示負數。但是主要的問題是因為兩個相反數相加不等于0導致其他運算的結果錯誤。
假設解決了相反數相加等于0:4-2=2+2-2=2,那么其他的運算也是可以得到正確結果的。
2.反碼為了解決這個問題,我們引入了反碼。
負數是一個正數的相反數,所以我們將一個正數全部按位取反來表示一個負數,這種表示負數的方式就是反碼。
比如:2是0010,那么-2就是1101,然后我們再來開始愉快的運算之路。
4-2=0100+1101=0001(反碼)=0001=1
2-2=0010+1101=1111(反碼)=1000=-0
-4-2=1011+1101=1000(反碼)=1111=-7
-1-2=1110+1101=1011(反碼)=1100=-4
實驗發現除了兩個相反數相加稍微接近我們所熟知的結果,其他的結果簡直不忍直視,所以用反碼來表示負數也是不靠譜的。
實際上,反碼是可以用來做運算的。我們發現當符號位存在進位的時候,此時你的運算的結果可能跟你的預期是有差距的,但是是可以通過修正結算過程來達到期望的結果的。修正的方法就是如果符號位有進位的情況下,將進位加到結果的最后一位就可以對結果達成修正。
比如:4-2=0100+1101=0001+1=0010=2 結果正確-4-2=1011+1101=1000(反碼)+1=1001(反碼)=1110=-6 結果正確-1-2=1110+1101=1011(反碼)+1=1100(反碼)=1011=-3 結果正確
這說明反碼是可以用來進行減法計算的,但是需要付出額外的代價,并且沒有解決+0和-0的問題。
3.補碼怎么來解決負數的表示問題呢?偉大的科學家們觀察自然界的運行規律,總結出了兩個很牛逼的概念,一個叫“模”,一個叫“補數”。
3
模
官方術語:
“?!笔侵敢粋€計量系統的計數范圍,如時鐘、日歷等。計算機也可以看成一個計量機器,它也有一個計量范圍。只要有一個計量范圍,即都存在一個“模”。
“?!睂嵸|上是計量器產生“溢出”的量,它的值在計量器上表示不出來,計量器上只能表示出模的余數。
比如:十二小時制的時鐘采用的是十二進制來表示時間,一到了12點,再向后就又從1開始了,所以12是時鐘系統的模。12是一個范圍,超過了十二一切從頭來過。
好多文章都說時鐘系統的計量范圍是0到11,但是沒有解釋為什么,我這邊猜測是因為時鐘采用的是12進制,如果不發生進位的話,那它就只能表示0到11這12個數。這跟我們的現實生活是對應得上的,我們一般講的12點其實是0點,所以12本來是在時鐘表示不出來的值,是一個溢出的量,但是為了方便人們的理解,才有了十二點的表示方式。
4
補數
民間解釋:
當M是系統的模的時候,如果|A|+|B|=M,我們就說A的補數是B,這個概念跟補角的概念類似,如果兩個角相加為180°,那么稱兩個角互補。(實際上補數還有一些別的解釋,但是目前我覺得這種解釋比較合理)。
說清楚了模和補碼,然后最重要的一個發現來了,在有模的系統中,減去一個數等于加上它的補數。還是以時鐘為例:如果我們把順時針看成正,把逆時針看成負,現在是2點,如果想要變成1點,可以逆時針轉一格,也可以順時針轉11格,寫成數學式子就是 2-1=2+11.
5
為什么?
除了補數可以解釋,還有說法是一個有模的系統里,如果發生數的溢出,那么溢出的這個數表示的數就是對M求模的結果(因為我們知道時鐘的取值范圍是0-11,超過了11,將又從0開始)。
2+11=1+12=1或者2+11=13 mod 12=1將時鐘遷移到計算機系統:比如一個4位的二進制,最多可以表示2^4=16個數,最大的數是1111=15,超過1111就會發生進位的情況,變成10000,因為只有四位,所以表示的是0000=0,然后再加一,變成0001=1,開始了循環,那么模的值就是16這個溢出的值。
有了上面的基礎,我們很輕松的就可以將減法直接變成加法來計算。
對于byte來說就是七位,七位正數最大的就是1111111 轉換成十進制就是127,從 2的0次方加到2的6次方。
然后負數呢,涉及到負數的編碼方式:
這里模是256,所以10000000到11111111其實表示的范圍是-128到-1,因為10000000是128,補數是-128,11111111是255,補數是-1。所以,byte的范圍是-128到127,一共256個數。
原文標題:為什么Byte是從-128到127?
文章出處:【微信公眾號:strongerHuang】歡迎添加關注!文章轉載請注明出處。
責任編輯:haq
-
存儲器
+關注
關注
38文章
7528瀏覽量
164204 -
計算機
+關注
關注
19文章
7534瀏覽量
88476
原文標題:為什么Byte是從-128到127?
文章出處:【微信號:strongerHuang,微信公眾號:strongerHuang】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論