整數在內存中存儲方式

原文鏈接:https://www.cnblogs.com/knsbyoo/p/9028056.html

我們都知道在計算機內部數據的存儲和運算都採用二進制,是因爲計算機是由很多晶體管組成的,而晶體管只有2種狀態,恰好可以用二進制的0和1表示,並且採用二進制可以使得計算機內部的運算規則簡單,穩定性高。在計算機中存在實數和整數,而整數又分爲無符號整數和有符號整數,無符號的整數表示很簡單,直接採用其二進制形式表示即可,而對於有符號數的表示卻成了問題,如何表示正負?如何去處理正負號?下面來具體說下其中的原因,在這之前先了解一下原碼、反碼和補碼這幾個概念。

1.原碼、反碼和補碼的概念

      在瞭解原碼、反碼和補碼之前先說一下有符號數和無符號數。用過C語言的都知道在C語言中用signed和unsigned來標識一個數是否是有符號還是無符號類型的。對於一個8bit的二進制來說,若當做無符號數處理,其能表示的整型值範圍是0~255,但是這樣表示數據就有個侷限性,如果數據是負的該如何表示?因此就引入了有符號類型的概念,對於有符號類型,規定取最高位爲符號位,若最高位爲0,則爲正數,否則爲負數,這樣一來對於8位二進制,示數值的就只有7位了,能夠表示的非負數值範圍變爲0~127,負值範圍爲-127~-1,相當於可以理解爲將無符號類型能夠表示的128~255拿來去表示-127~-1了。事實上,在計算機內部存儲中,計算機自己是無法去區分無符號還是有符號類型的,對於255和-1,在計算機內部存儲的都是11111111。換個角度來說,如果事先知道內存中存儲了這樣一個8位二進制11111111,但是誰也不能肯定它具體表示什麼數值,是-1還是255?這個是需要靠程序員自己去指定的,如果指定爲無符號類型,則編譯器則通過相應指令將其轉換爲數值255。事實上對於-x的二進制補碼錶示形式和(256-x)(256-x當做無符號類型處理)的二進制表示形式相同,從這裏可以略微瞭解了補碼的含義了。在教材中對於原碼、反碼以及補碼一般是這麼定義的:對於正數原碼、反碼以及補碼是其本身。負數的原碼是其本身,反碼是對原碼除符號位之外的各位取反,補碼則是反碼加1。原碼、反碼、補碼的概念是針對有符號類型而言的。

  1)能夠統一+0和-0的表示,以byte類型爲例子

  採用原碼錶示,+0的二進制表示形式爲0 000 0000,而-0的二進制表示形式爲1 000 0000;

  採用反碼錶示,+0的二進制表示形式爲0 000 0000,而-0的二進制表示形式爲1 111 1111;

  採用補碼錶示,+0的二進制表示形式爲0 000 0000,而-0的二進制表示形式爲1 111 1111+1=1 0000 0000,因爲計算機會進行截斷,只取低8位,所以-0的補碼錶示形式爲0000 0000。

  從上面可以看出只有用補碼錶示,+0和-0的表示形式才一致。正因爲如此,所以補碼的表示範圍比原碼和反碼錶示的範圍都要大,用補碼能夠表示的範圍爲-128~127,0~127分別用00000000~01111111來表示,而-127~-1則用10000001~11111111來表示,多出的10000000則用來表示-128。因此對於任何一個n位的二進制,假若表示帶符號的整數,其表示範圍爲-2^(n-1)~2^(n-1)-1,且有MAX+1=MIN。假如不採用補碼來表示,那麼計算機中需要對+0和-0區別對待,顯然這個對於設計來說要增加難度,而且不符合運算規則。

  2)對於有符號整數的運算能夠把符號位同數值位爲一起處理

  由於將最高位作爲符號位處理,不具有實際的數值意義,那麼如何在進行運算時處理這個符號位?如果單獨把符號位進行處理,顯然又會增加電子器件的設計難度和CPU指令設計的難度,但是採用補碼能夠很好地解決這個問題。下面舉例說明:

  比如-2+3=1

  如果採用原碼錶示(把符號位同數值位一起處理):

  1 000 0010+0 000 0011=1 000 0101=(-5)原,顯然這個結果是錯誤的。

  如果採用反碼錶示

  1 111 1101+0 000 0011=1 0000 0000=0 0000000=(+0)反,顯然這個結果也是錯誤的。

  如果採用補碼錶示

  1 111 1110+0 000 0011=1 0000 0001=0000 0001=(1)補,結果是正確的。

  從上面可以看出,當把符號位同數值位一起進行處理時,只有補碼的運算纔是正確的。如果不把符號位和數值位一起處理,會給CPU指令的設計帶來很大的困難,如果把符號位單獨考慮的話,CPU指令還要特意對最高位進行判斷,這個對於計算機的最底層實現來說是很困難的。

  3)能夠簡化運算規則

  對於-2+3=1這個例子來說,可以看作是3-2=1,也即[3]+[-2]=1,從上面的運算過程可知採用補碼運算相當於是

  [3]補+[-2]補=[1]補,也即可以把減法運算轉換爲加法運算。這樣一來的好處是在設計電子器件時,只需要設計加法器即可,不需要單獨再設計減法器。

  總的來說,採用補碼主要有以上幾點好處,從而使得計算機從硬件設計上更加簡單以及簡化CPU指令的設計。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章