這些東西屬計算機基礎的知識,這裡簡單說一下。
計算機的資料型別在大的方向上可分為整數和浮點數,而整數和浮點數在計算機中的儲存方式是不一樣的。浮點數的儲存方式比較複雜,這裡先不說,現在主要談談整數的儲存。前面說了,計算機是二進位制的機器,是按照二進位制的補碼方式儲存資料的。那麼,補碼是什麼呢,怎麼計算呢?
1.原碼
首先來說原碼:以下為了表述方便,使用乙個位元組長的資料進行舉例。
一般來說,計算機要表示正數和負數,需要用一位來表示符號位,一般是最高位,0表示正數,最高位1表示負數。而正數的原碼 = 反碼 = 補碼,也就是說正數就是直接把二進位制序列儲存起來就可以了。比如15在計算機中的儲存序列就是 0000 1111.最高位0表示這是正數。
那麼負數也是這麼儲存的嗎? -15 的儲存序列是 1000 1111 嗎?
答案肯定不是的。前面說了,是按照補碼方式儲存的,正數正好原碼反碼補碼都一樣,負數可就不一樣了。那麼,負數怎麼儲存呢?也就是說補碼怎麼計算呢?
2.反碼
為了計算補碼,就得引出反碼的概念,其實前面 1000 1111 是 -15 的原碼,負數的原碼就是取絕對值化成二進位制,再把符號位變成 1.所以反碼的計算規則就是把原碼符號位不變,其他位按位取反,就是把 1 變成 0 ,把 0 變成 1.所以,-15的反碼就是 1111 0000 .
3.補碼
有了反碼,就可以計算補碼了,補碼的計算規則是將反碼加一。即 -15 的補碼就是 1111 0001.所以,-15在計算機中儲存的就是1111 0001的二進位制序列。
在使用時,再把它轉換成原碼,那麼從補碼到原碼的計算過程你可以按照反過程先把補碼減一,再符號位不變,其他位按位取反,這樣可以得到原碼,但是其實原碼和補碼是互為補碼的,也就是說可以把補碼符號位不變,再其他位按位取反再加一,也可以得到原碼。
拓展那麼,為什麼要使用補碼的方式儲存呢?
這與計算機的處理器的硬體結構有關:其實計算機底層是只計算加法的,我們知道乘法可以轉換成加法,而除法可以轉化成減法,於是,有了補碼,則可以把減法轉化成加法。這樣在處理器的硬體結構設計上就只可以設計乙個加法器就可以了,簡化了計算機的硬體結構設計。具體怎麼轉的其實還是稍有一點複雜的,還要證明一些理論,感興趣的朋友也可以查一查相關資料。我不再贅述,也不是很了解0.0
最後,在乙個位元組的資料中,有沒有人注意到為什麼負數可以到-128,而正數最高到127呢?也就是說,-128在計算機中是怎麼儲存的?
你會發現-128其實是「溢位」的。我們先來看另乙個問題
前面將整數的儲存按正負之分分成了兩種方式,那麼 0 怎麼辦呢?
零在儲存的時候有符號位嗎?如果有,那麼 0 就有 2 種儲存方式,分別是 0000 0000 和 1000 0000,首先不用說 8 個 0 的序列肯定是 0 的儲存方式,那1000 0000 呢,也是 0 嗎?
再來看 - 128 的儲存,會發現, 128的二進位制形式正好是 1000 0000,如果算上符號位,則正好是溢位了,所以,-128的儲存序列規定是 1000 0000.也就不存在兩個 0 了。(沒有所謂正 0 與 負 0 )所以呢,這個 - 128 的儲存方式其實是規定出來的。。。
制定這一標準的組織叫做 ieee 國際標準化組織(不是熟悉的 iso),感興趣的朋友可以查一下,這個組織很厲害的。包括浮點數的儲存標準也是它們制定的。
原碼 反碼和補碼
數值有正負之分 計算機就用乙個數的最高位存放符號 0為正 1為負 這就是機器數的原碼了 假設機器能處理的位數為 8.即字長為 1byte,原碼能表示數值的範圍為 127 0 0 127 共256個.有了數值的表示方法就可以對數進行算術運算 但是很快就發現用帶符號位的原碼進行乘除運算時結果正確 而在加...
原碼 反碼 和 補碼。
這裡只講下自己對反碼的理解。大家都知道使用反碼表示負數有兩個優點,1.可以使得減法可以和加法一樣。2.符號位也參與了運算。那這是為什麼呢?下面可以進行一些簡單的數學推導 根據反碼定義,對於負數,反碼是除符號為以外取反 1。例如,4 變換步驟如下。a 4 0 000 0100 b 取反 0 111 1...
原碼 補碼和反碼
1 原碼表示法 原碼表示法是機器數的一種簡單的表示法。其符號位用0表示正號,用 表示負號,數值一般用二進位制形式表示。設有一數為x,則原碼表示可記作 x 原。例如,x1 1010110 x2 一1001010 其原碼記作 x1 原 1010110 原 01010110 x2 原 1001010 原 ...