負數:
原碼就是原來的表示方法
反碼是除符號位(最高位)外取反
補碼=反碼+1
以前學習二進位制編碼時,老師講了一堆堆的什麼原碼啊反碼啊補碼啊***x轉換啊,還有負數的表示方式啊 總是記不零清,終於從網上找到了一種比較好的講解方式,儲存再share一下,不過為了系統化講解,又找來了一些編碼的基礎知識,如果只想看負數編碼記憶法,請跳轉到
1.如果你不知道二進位制怎麼編碼,請繼續,否則請跳到2
1位元組 = 8位,所以它能表示的最大數當然是8位都是1(既然2進製的數只能是0或1,如果是我們常見的10進製,那就8位都為9,這樣說,你該懂了?)
1位元組的二進位制數中,最大的數:11111111。
這個數的大小是多少呢?讓我們來把它轉換為十進位制數。
無論是什麼進製,都是左邊是高位,右邊是低位。10進製是我們非常習慣的計數方式,第一位代表有幾個1(即幾個100),第二位代表有幾個10(即幾個101),第三位代表有幾個100(即有幾個102)…,用小學課本上的說法就是:個位上的數表示幾個1,十位上的數表示向個10,百位上的數表示幾個100……
同理可證,二進位制數則是:第1位數表示幾個1 (20),第2位數表示幾個2(21),第3位數表示幾個4(22),第4位數表示向個8(23)……
以前我們知道1個位元組有8位,現在通過計算,我們又得知:1個位元組可以表達的最大的數是255,也就是說表示0~255這256個數。
那麼兩個位元組(雙位元組數)呢?雙位元組共16位。 1111111111111111,這個數並不大,但長得有點眼暈,從現在起,我們要學會這樣來表達二制數:
1111 1111 1111 1111,即每4位隔一空格。
雙位元組數最大值為:
1 * 215 + 1 *214 + 1* 213 + 1 * 212 + 1 * 211 + 1 * 210 + …… + 1 * 22 + 1 * 21 + 1* 20 = 65535
很自然,我們可以想到,一種資料型別允許的最大值,和它的位數有關。具體的計算方法方法是,如果它有n位,那麼最大值就是:
n位二進位制數的最大值:1 * 2(n-1) + 1 * 2(n-2) + ... + 1 * 20
2、理解有符號數和無符號數
負數在計算機中如何表示呢?這一點,你可能聽過兩種不同的回答。
一種是教科書,它會告訴你:計算機用「補碼」表示負數。可是有關「補碼」的概念一說就得一節課,這一些我們需要在第6章中用一章的篇幅講2進製的一切。再 者,用「補碼」表示負數,其實一種公式,公式的作用在於告訴你,想得問題的答案,應該如何計算。卻並沒有告訴你為什麼用這個公式就可以和答案? -----我就是被這個弄混淆的》_<
另一種是一些程式設計師告訴你的:用二進位制數的最高位表示符號,最高位是0,表示正數,最高位是1,表示負數。這種說法本身沒錯,可是如果沒有下文,那麼它就是錯的。至少它不能解釋,為什麼字元型別的-1用二進位制表示是「1111 1111」(16進製為ff);而不是我們更能理解的「1000 0001」。(為什麼說後者更好理解呢?因為既然說最高位是1時表示負數,那1000 0001不是正好是-1嗎?-----re!當初偶就是這麼想的,so一直在腦中打架,越打越混淆=,=)。
讓我們從頭說起。
2.1、你自已決定是否需要有正負。
就像我們必須決定某個量使用整數還是實數,使用多大的範圍數一樣,我們必須自已決定某個量是否需要正負。如果這個量不會有負值,那麼我們可以定它為帶正負的型別。
在計算機中,可以區分正負的型別,稱為有符型別,無正負的型別(只有正值),稱為無符型別。
數值型別分為整型或實型,其中整型又分為無符型別或有符型別,而實型則只有符型別。
字元型別也分為有符和無符型別。
比如有兩個量,年齡和庫存,我們可以定前者為無符的字元型別,後者定為有符的整數型別。
2、使用二制數中的最高位表示正負。
首先得知道最高位是哪一位?1個位元組的型別,如字元型別,最高位是第7位,2個位元組的數,最高位是第15位,4個位元組的數,最高位是第31位。不同長度的數值型別,其最高位也就不同,但總是最左邊的那位(如下示意)。字元型別固定是1個位元組,所以最高位總是第7位。
(紅色為最高位)
單位元組數: 1111 1111
雙位元組數: 1111 1111 1111 1111
四位元組數: 1111 1111 1111 1111 1111 1111 1111 1111
當我們指定乙個數量是無符號型別時,那麼其最高位的1或0,和其它位一樣,用來表示該數的大小。
當我們指定乙個數量是有符號型別時,此時,最高數稱為「符號位」。為1時,表示該數為負值,為0時表示為正值。
3、無符號數和有符號數的範圍區別。
無符號數中,所有的位都用於直接表示該值的大小。有符號數中最高位用於表示正負,所以,當為正值時,該數的最大值就會變小。我們舉乙個位元組的數值對比:
無符號數: 1111 1111 值:255 1* 27 + 1* 26 + 1* 25 + 1* 24 + 1* 23 + 1* 22 + 1* 21 + 1* 20
有符號數: 0111 1111 值:127 1* 26 + 1* 25 + 1* 24 + 1* 23 + 1* 22 + 1* 21 + 1* 20
同樣是乙個位元組,無符號數的最大值是255,而有符號數的最大值是127。原因是有符號數中的最高位被挪去表示符號了。並且,我們知道,最高位的權值也是最高的(對於1位元組數來說是2的7次方=128),所以僅僅少於一位,最大值一下子減半。
不過,有符號數的長處是它可以表示負數。因此,雖然它的在最大值縮水了,卻在負值的方向出現了伸展。我們仍乙個位元組的數值對比:
無符號數: 0 ----------------- 255
有符號數: -128 --------- 0 ---------- 127
同樣是乙個位元組,無符號的最小值是 0 ,而有符號數的最小值是-128。所以二者能表達的不同的數值的個數都一樣是256個。只不過前者表達的是0到255這256個數,後者表達的是-128到+127這256個數。
乙個有符號的資料型別的最小值是如何計算出來的呢?
有符號的資料型別的最大值的計算方法完全和無符號一樣,只不過它少了乙個最高位(見第3點)。但在負值範圍內,數值的計算方法不能直接使用1* 26 + 1* 25 的公式進行轉換。在計算機中,負數除為最高位為1以外,還採用補碼形式進行表達。所以在計算其值前,需要對補碼進行還原。這裡,先直觀地看一眼補碼的形式:
以我們原有的數學經驗,在10進製中:1 表示正1,而加上負號:-1 表示和1相對的負值。
那麼,我們會很容易認為在2進製中(1個位元組): 0000 0001 表示正1,則高位為1後:1000 0001應該表示-1。
然而,事實上計算機中的規定有些相反,請看下表:
二進位制值(1位元組)
十進位制值
1000 0000紅色的1代表負數藍色的是補碼(補碼=反碼+1)
-128
1000 0001
藍色部分代表多大的值?:將補碼還原為原碼
-127想化成負數?:先減去1再按位取反
1000 0010
還原方法:補碼-1再取反
-126
1000 0011
-125
......
1111 1110
-21111 1111
-1首先我們看到,從-1到-128,其二進位制的最高位都是1(表中標為紅色),正如我們前面的學。
然後我們有些奇怪地發現,1000 0000 並沒有拿來表示 -0;而1000 0001也不是拿來直觀地表示-1。事實上,-1 用1111 1111來表示。
怎麼理解這個問題呢?先得問一句是-1大還是-128大?
當然是 -1 大。-1是最大的負整數。以此對應,計算機中無論是字元型別,或者是整數型別,也無論這個整數是幾個位元組。它都用全1來表示 -1。比如乙個位元組的數值中:1111 1111表示-1,那麼,1111 1111 - 1 是什麼呢?和現實中的計算結果完全一致。1111 1111 - 1 = 1111 1110,而1111 1110就是-2。這樣一直減下去,當減到只剩最高位用於表示符號的1以外,其它低位全為0時,就是最小的負值了,在一位元組中,最小的負值是1000 0000,也就是-128。
我們以-1為例,來看看不同位元組數的整數中,如何表達-1這個數:
位元組數二進位制值
十進位制值
單位元組數
1111 1111紅色表示負數藍色部分的補碼為值1-1
負數:原碼就是原來的表示方法、反碼是除符號位(最高位)外取反、補碼=反碼+1雙位元組數
1111 1111 1111 1111
-1四位元組數
1111 1111 1111 1111 1111 1111 1111 1111
-1可能有同學這時會混了:為什麼 1111 1111 有時表示255,有時又表示-1?所以我再強調一下本節前面所說的第2點:你自已決定乙個數是有符號還是無符號的。寫程式時,指定乙個量是有符號的,那麼 當這個量的二進位制各位上都是1時,它表示的數就是-1;相反,如果事選宣告這個量是無符號的,此時它表示的就是該量允許的最大值,對於乙個位元組的數來說, 最大值就是255。
二進位制編碼知識
對於整型資料,二進位制的表示為符號位 數值位,對於浮點型資料,十進位制轉二進位制的方式如下 將十進位制浮點型資料轉換為二進位制時分別將整數部分和小數部分轉化為二進位制 對於整數部分,每次除2取餘直到商為0,第乙個除法所得餘數為最低位。即將餘數反序排列 對於小數部分,每次將其小數字乘以2,取其整數字,...
二進位制編碼 小記
byte 範圍 128 127 16進製制 0xff 二進位制 1111 1111 int 256 解為 首一位為符號位 整體取反碼 0000 0000 加1 為0000 0001 為1 加上符號為 byte 1 例如 16進製制 0x7f 二進位制 0111 1111 int 127 解為 首一位...
二進位制的編碼
假設有乙個只有4位的二進位制 0000,0001,0010,0011,0100,0101,0110,0111,1000,1001,1010,1011,1100,1101,1110,1111,共16個數,來表示 8到7共16個數。很自然的我們想到用0000 0111來表示0 7.8到 1該用誰來表示呢...