二進制原碼、反碼、補碼


主要是負值和(+0,-0)需要補碼在底層區分。

先問:為什么會有反碼,原碼?

  1. 反碼解決了負值,但無法解決+0、-0,這兩個0不需要區分+-。
  2. 源碼的出現就解決了-0的源碼。

過程展示(引用CSDN的文章):

1.基礎概念和計算方法

在探求為何機器要使用補碼之前, 讓我們先了解原碼, 反碼和補碼的概念.對於一個數, 計算機要使用一定的編碼方式進行存儲. 原碼, 反碼, 補碼是機器存儲一個具體數字的編碼方式.

1.1模的概念

把一個計量單位稱之為模或模數
補碼的模為10000 0000
反碼的模為1000 0000(從反碼的定義也能夠知道,即反碼的運算不涉及符號位)
模的解釋
在日常生活中,有許多化減為加的例子。例如,時鍾是逢12進位,12點也可看作0點。
當將時針從10點調整到5點時有以下兩種方法:
(1)時針逆時針方向撥5格,相當於做減法: 10-5=5
(2)時針順時針方向撥7格,相當於做加法:10+(12-5)=12+5=5    (模為 12)

同理,計算機的運算部件與寄存器都有一定字長的限制(假設字長為8),因此它的運算也是一種模運算。當計數器計滿8位也就是256個數后會產生溢出,又從頭開始計數。產生溢出的量就是計數器的模,顯然,8位二進制數,它的模數為28=256。在計算中,兩個互補的數稱為“補碼”。

1.2原碼

原碼就是符號位加上真值的絕對值, 即用第一位表示符號, 其余位表示值. 比如如果是8位二進制:

[+1]原 = 0000 0001

[-1]原 = 1000 0001

第一位是符號位. 因為第一位是符號位, 所以8位二進制數的取值范圍就是:

[1111 1111 , 0111 1111]

[-127 , 127]

原碼是人腦最容易理解和計算的表示方式

1.3反碼

反碼的表示方法是:

正數的反碼是其本身

負數的反碼是在其原碼的基礎上, 符號位不變,其余各個位取反.

[+1] = [00000001]原 = [00000001]反

[-1] = [10000001]原 = [11111110]反

可見如果一個反碼表示的是負數, 人腦無法直觀的看出來它的數值. 通常要將其轉換成原碼再計算

1.4補碼

補碼的表示方法是:

正數的補碼就是其本身

負數的補碼是在其原碼的基礎上, 符號位不變, 其余各位取反, 最后+1. (即在反碼的基礎上+1)

[+1] = [00000001]原 = [00000001]反 = [00000001]補

[-1] = [10000001]原 = [11111110]反 = [11111111]補

對於負數, 補碼表示方式也是人腦無法直觀看出其數值的. 通常也需要轉換成原碼在計算其數值. 

1.5其他概念
由於計算機中符號和數字一樣,都必須用二進制數串來表示,因此,正負號也必須用0、1來表示。
用最高位0表示正、1表示負, 這種正負號數字化的機內表示形式就稱為“機器數”,
而相應的機器外部用正負號表示的數稱為“真值”,將一個真值表示成二進制字串的機器數的過程就稱為編碼。

2.為何要使用原碼、反碼和補碼

現在我們知道了計算機可以有三種編碼方式表示一個數. 對於正數因為三種編碼方式的結果都相同:

[+1] = [00000001]原 = [00000001]反 = [00000001]補

所以不需要過多解釋. 但是對於負數:

[-1] = [10000001]原 = [11111110]反 = [11111111]補

可見原碼, 反碼和補碼是完全不同的. 既然原碼才是被人腦直接識別並用於計算表示方式, 為何還會有反碼和補碼呢?

首先, 因為人腦可以知道第一位是符號位, 在計算的時候我們會根據符號位, 選擇對真值區域的加減. (真值的概念在本文最開頭). 但是對於計算機, 加減乘數已經是最基礎的運算, 要設計的盡量簡單. 計算機辨別"符號位"顯然會讓計算機的基礎電路設計變得十分復雜! 於是人們想出了將符號位也參與運算的方法. 我們知道, 根據運算法則減去一個正數等於加上一個負數, 即: 1-1 = 1 + (-1) = 0 , 所以機器可以只有加法而沒有減法, 這樣計算機運算的設計就更簡單了.

於是人們開始探索 將符號位參與運算, 並且只保留加法的方法. 首先來看原碼:

計算十進制的表達式: 1-1=0

1 - 1 = 1 + (-1) = [00000001]原 + [10000001]原 = [10000010]原 = -2

如果用原碼表示, 讓符號位也參與計算, 顯然對於減法來說, 結果是不正確的.這也就是為何計算機內部不使用原碼表示一個數.

為了解決原碼做減法的問題, 出現了反碼:

計算十進制的表達式: 1-1=0

1 - 1 = 1 + (-1) = [0000 0001]原 + [1000 0001]原= [0000 0001]反 + [1111 1110]反 = [1111 1111]反 = [1000 0000]原 = -0

發現用反碼計算減法, 結果的真值部分是正確的. 而唯一的問題其實就出現在"0"這個特殊的數值上. 雖然人們理解上+0和-0是一樣的, 但是0帶符號是沒有任何意義的. 而且會有[0000 0000]原和[1000 0000]原兩個編碼表示0.

於是補碼的出現, 解決了0的符號以及兩個編碼的問題:

1-1 = 1 + (-1) = [0000 0001]原 + [1000 0001]原 = [0000 0001]補 + [1111 1111]補 = [0000 0000]補=[0000 0000]原

這樣0用[0000 0000]表示, 而以前出現問題的-0則不存在了.而且可以用[1000 0000]表示-128:

(-1) + (-127) = [1000 0001]原 + [1111 1111]原 = [1111 1111]補 + [1000 0001]補 = [1000 0000]補

-1-127的結果應該是-128, 在用補碼運算的結果中, [1000 0000]補 就是-128. 但是注意因為實際上是使用以前的-0的補碼來表示-128, 所以-128並沒有原碼和反碼表示.(對-128的補碼表示[1000 0000]補算出來的原碼是[0000 0000]原, 這是不正確的)

使用補碼, 不僅僅修復了0的符號以及存在兩個編碼的問題, 而且還能夠多表示一個最低數. 這就是為什么8位二進制, 使用原碼或反碼表示的范圍為[-127, +127], 而使用補碼表示的范圍為[-128, 127].

因為機器使用補碼, 所以對於編程中常用到的32位int類型, 可以表示范圍是: [-231, 231-1] 因為第一位表示的是符號位.而使用補碼表示時又可以多保存一個最小值.

而且實際上並不是從10000001到11111111依次表示-1到-127,而是剛好相反的,從10000001到11111111依次表示-127到-1

用補碼表示負數時:負數X用2^n - |X|來表示,其中n為機器的字長

當n=8時,[-1]補 = 2^8 - 1 = 11111111, [-127]補 = 2^8 - 127 = 100000001

[-0]補=2^8=00000000在補碼表示法中只有一種表示,即00000000

3.二進制編碼

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

4.原碼、補碼和反碼的進一步說明
在計算機里如何表示整數?
整數有無窮多個,在計算機里,通常我們只能表示出其中的一部分。假如我們用 n 個比特來表示一個整數。1 個比特有 2 個狀態,n 個比特就有 2^n 個狀態,把這 2^n 個狀態的集合記為 A. 顯然,用 A,我們可以與 n 個整數建立起一一對應。我們還希望 A 所表示的整數能夠象整數那樣地運算---整數,象整數那樣運算,這是不是一句廢話?數學中的整數相加,仍然是一個整數,但 A 里兩個整數相加,我們卻無法保證它們的和仍在 A 中,用代數的術語來講,叫做 "不滿足封閉性",這是個很壞的性質。
4.1補碼
不過數學上有處理這個問題的成熟方案,如果我們能后退一步,讓 A 表示的是模 |A| 的剩余類,則加法運算馬上就封閉了。而且這個時候 A 不僅可以與 2^n 個整數對應起來,而且,在某種意義下,可以與整數環 Z 對應起來。用代數的觀點,這個 "某種意義"就是所謂的同態。
整數有兩種封閉運算,一種是加法,另一種是乘法。A 作為模 2^n 的剩余類,也有加乘兩種運算。定義 Z 到 A 的映射 
f(x) = m mod 2^n
f 是一個同態,也就是說,f 滿足這樣的良好性質:
f(x+y) = f(x) + f(y) 
f(xy) = f(x)f(y)
我們通常使用 10 進制數,在這個進制下,f(x) 並不容易計算,但是在計算機里,本質的表示是二進制,於是 f(x) 的運算變得出奇地簡單。如果 x 小於 2^n,則 x 的 2 進制表示就是 f(x),如果 x>=2^n,則要求其模 2^n 的余數,這恰好是 x 二進制表示的最低 n 位,換句話說,簡單地把高位拋棄就行了。順便指出,f(0)=0, f(1)=1.
我們來看一看 A 中的加法,f(x)+f(y), 若結果小於 2^n,則運算自然封閉,如果 f(x)+f(y) >= 2^n,則取其最低的 n 位,用電路實現時,可以簡單地扔掉高位,保留低位。
到目前為止,一切都很好,但是減法怎么辦呢?對整數運算而言,減去 a 不過是加上 a 的相反數的同義語。只要對 A 中的每個元素,能容易計算出其相反數就可以了。理論上 f(x) 的相反數就是
f(-f(x))
不過這個好像不容易計算,因為我們現在並沒有給出 A 中"負數"的概念,事實上 A 是模 2^n 的剩余類環,根本就沒有所謂的負數。
這個困難也是容易處理的。作為 f(x) 的相反數,-f(x) 應該滿足這樣的性質:
-f(x) + f(x) = f(0) = 0
所以我們只要有在 A 中找一個元素,使得它與 f(x) 的和是 0 就可以了。但是 f(x) 本身可能含有很多比特 1,加上一個數能使它們變成 0 嗎? 考慮到 A 中的加法要模去一個 2^n,這個問題實際上很好辦,只要讓求出的和是 2^n 就可以了。所以難發現 -f(x) 就是把 f(x) 的比特"取反"---即 0 變 1, 1 變 0,並加上 1 就得到了 -f(x)。容易驗證:
f(-x) = - f(x).
現在我們回過頭來看前面的一句話,紅色部分:
"我們通常使用 10 進制數,在這個進制下,f(x) 並不容易計算,但是在計算機里,本質的表示是二進制,於是 f(x) 的運算變得出奇地簡單。如果 x 小於 2^n,則 x 的 2 進制表示就是 f(x),如果 x>=2^n,則要求其模 2^n 的余數,這恰好是 x 二進制表示的最低 n 位,換句話說,簡單地把高位拋棄就行了。順便指出,f(0)=0, f(1)=1."
紅色那句話簡直是胡扯,因為沒有考慮到負數的情況。但 f(x) 容易計算這句話並沒有錯,因為當 x 為負數時,我們可以利用 f(x) = -f(-x)。 由於 -x 是正的,f(-x) 容易計算,之后 -f(x) 也不過是取反加 1 而已。
好,到目前為止---在數學世界里,簡直是完美的。但是回到現實, A 里頭真的沒有負數,怎么辦?整數能比較大小,A 里頭的數又怎么辦?
這時候,我們可以用一個不太完美的方案,把 A 里頭的元素再映射回整數 Z 中,如果只需要無符號的數,則變換為
g(u) = u,    0<= u <2^n-1
其實就是不把 A 中的元素模 2^n 的剩余類,而直接看成整數。不過這時的運算就要考慮溢出了。如果是無符號的情形,運算的結果仍是模 2^n 的余數,外加一個溢出標志。
如果要考慮負數,如果沒有特別的理由,則要求正負個數大致相等是自然的。可以考慮讓 0 代表 0, 1~2^{n-1}-1 代表正數,2^{n-1}+1~2^n-1 代表負數。丟掉一個 2^{n-1} 是因為希望正數和負數剛好配對,若 u 代表負數,則其落在 2^{n-1}+1~2^n-1 中,但它代表負幾呢?當然是負 -u 了。從兩個相反數之和為 0 ,或 2^n 的觀點,-u 就是 2^n-u, 而 u 則是 -(-u) 即 u-2^n。
2^{n-1} 是個麻煩,在 A 中,它的相反數就是自己,把它當正數,負數都不大合理。出於完整性考慮,隨便選一個好了。在這里我們讓 2^{n-1} 為負數,理由是它的最高位是 1,跟其它"負數"長得比較象。
換個角度看,模 n 的剩余類,或者余數為 0,1,...,2^{n-1}, 2^{n-1}+1, ..., 2^n-1. 這些余數也可以表示為:
0,1~2^{n-1}, 2^n-(2^{n-1}-1), ..., 2^{n}-1
我們剛才所做的就是把上面數列中 2^{n} -r (1<= r<= 2^{n-1}-1)類型的的數對應為負數 -r 而已。用代數的術語,就是在陪集中選取了不同的代表元。
於是我們定義 A 到 Z 的變換,使得
當 0<= u <= 2^{n-1} 時, g(u) = u 
當 2^{n-1} <u < 2^n 時,g(u)=u - 2^n
當然,這時運算起來有可能溢出,但結果仍可以看成模 2^n 的余數,外加一個溢出標記。
上面所說的就是補碼。
4.2反碼
抽象地看,反碼與補碼只有一個區別,同樣的 n 比特狀態集合 A,反碼讓這些元素表示模 2^n-1 的剩余類,而補碼模 2^n。於是從 Z 到 A 的映射定義為
f(x) = x mod 2^n-1
不過且慢,A 的大小是 2^n,而模 2^n-1 的余數只有 2^n-1 個? 是的,這是反碼一個不完美的地方,它浪費了全 1 的碼字,不過我們可以把全 1 的和全 0 的數看成一樣的。
f 同樣是個環同態,滿足
f(x+y) = f(x) + f(y) 
f(xy) = f(x)f(y) 
俄且 f(0)=0, 或者全 1, f(1) = 1.
f(x) 可以計算如下,設 
x = 2^n q + r,
則由於 2^n = 1 mod (2^n-1),所以
x = q + r (mod 2^n -1)
若然 q+r 仍大於等於 2^n,則遞歸使用上述步驟。當然也可以直接去模 2^n-1,但上面的處理充分利用了二進制表示。而且當 x 為負數時,我們有兩外的處理方法,見后面相反數的部分。
f(x) 能求出后,A 中的加法運算和乘法運算也就容易處理了,若 f(x)+f(y)<2^n,則不作特別處理,如果 f(x)+f(y) >=2^n,則結果為 f(f(x)+f(y)) 即把第 n+1 比特加到最低比特上。對於乘法,f(x)f(y) 可以多出n-1 位,處理方法是把第 n+i 比特加到第 i 比特上,或者說把高出 n 位的比特都右移 n 位並加在低位上, 如果仍然越界,則重復上述步驟。從這里可以看到反碼的一個弱點,它的越界處理比較麻煩,而補碼直接把越界的位丟掉就是了。
A 中的相反數如何求? -f(x) + f(x) = f(0) = 0, 加出一個全零比較難辦,但加出一個全 1 不是問題,所以我們可以讓 -f(x) 為 x 的取反,即 0 變成 1, 1 變成 0。於是求相反數的問題解決了。
同樣,我們可以考慮在反碼中引入正數,負數,這個與補碼的類似,這里就不多說了。
有趣的是 2^n 幾乎不可能是素數,而 2^n-1 有可能. 2^n-1 形的素數稱為梅森素數。如果 2^n-1 是素的,則 A 中非零元素都可求逆。那么對應於 32 位和 64 位計算機的,將會是 31 位計算機和 61 位計算機,看上去很不錯嘛,期待中。
4.3原碼
這個沒有什么可說的,2^n 個狀態直接表示 0~2^n-1,如果要引入負數,則讓最高位為 1 的表示負數, 所以 0x 代表 x,而 1x 代表 -x.
原碼最好的地方是它簡單,最不好的地方在於它沒有良好的代數結構。

5.補碼的原理及隨想 
越早在課堂上學的東西,越給我以簡單的印象,忘得也越快。而事實上,它們往往是最富有智慧的,即便在我沒忘的時候,也沒有深刻地理解它們。 
嘛是補碼?不少書上扯一堆“取反加1”之類的規則,很不着重點,我覺得核心在於: 
對於范圍為[0,M)的整數計量系統,其模為M。和為M的兩個數互為補數。 
如果有兩個整數a,b∈[0, M),那么f(a-b)==f(a+c),其中c= M-b,是b的補碼, 
f是一個映射,定義為: 
當0 <=x < M時,f(x)=x; 
當x>= M時,f(x)=x % M;-------->此時就要消除溢出 
當x <0時,f(x)=f(M +x). 
其中%為取余運算(效果同編程語言中的取模運算)。 
在計算機中,f是由溢出隱式實現的,所以天生就有a-b==a+c。這就把減運算轉化成了加運算。 
於是,為了便於執行減運算,計算機就把-b表示為其補碼c。 
假設機器字有n位,那么M=2n,c=2n-b。 
人在紙上怎么計算2n-b的二進制值?2n的原碼就是1后面跟了n個0,直接用它減b的原碼不方便,先用2n-1的原碼(n個1)減b的原碼,得到的結果加上1就是2n-b的值了——這就是“取反加1”的由來。 
6.有符號數,無符號數
同樣是年紀和工資,前者不需要有負值,但后者可能需要——至少所有的老板都這樣認為。那么,負數在計算機中如何表示呢?這一點,你可能聽過兩種不同的回答。

一種是教科書,它會告訴你:計算機用“補碼”表示負數。可是有關“補碼”的概念一說就得一節課,這一些我們需要在第6章中用一章的篇幅講2進制的一切。再者,用“補碼”表示負數,其實一種公式,公式的作用在於告訴你,想得問題的答案,應該如何計算。卻並沒有告訴你為什么用這個公式就可以和答案?

另一種是一些程序員告訴你的:用二進制數的最高位表示符號,最高位是0,表示正數,最高位是1,表示負數。這種說法本身沒錯,可是如果沒有下文,那么它就是錯的。至少它不能解釋,為什么字符類型的-1用二進制表示是“1111 1111”(16進制為FF);而不是我們更能理解的“1000 0001”。(為什么說后者更好理解呢?因為既然說最高位是1時表示負數,那1000 0001不是正好是-1嗎?)。

讓我們從頭說起。

6.1你自已決定是否需要有正負。

就像我們必須決定某個量使用整數還是實數,使用多大的范圍數一樣,我們必須自已決定某個量是否需要正負。如果這個量不會有負值,那么我們可以定它為帶正負的類型。

在計算機中,可以區分正負的類型,稱為有符類型,無正負的類型(只有正值),稱為無符類型。

數值類型分為整型或實型,其中整型又分為無符類型或有符類型,而實型則只有符類型。

字符類型也分為有符和無符類型。

比如有兩個量,年齡和庫存,我們可以定前者為無符的字符類型,后者定為有符的整數類型。

6.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時表示為正值。

6.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 -128 1000 0001 -127 1000 0010 -126 1000 0011 -125 ... ... 1111 1110 -2 1111 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 雙字節數 1111 1111 1111 1111 -1 四字節數 1111 1111 1111 1111 1111 1111 1111 1111 -1

可能有同學這時會混了:為什么 1111 1111 有時表示255,有時又表示-1?所以我再強調一下本節前面所說的第2點:你自已決定一個數是有符號還是無符號的。寫程序時,指定一個量是有符號的,那么當這個量的二進制各位上都是1時,它表示的數就是-1;相反,如果事選聲明這個量是無符號的,此時它表示的就是該量允許的最大值,對於一個字節的數來說,最大值就是255。

7.參考文獻

http://hi.baidu.com/plato/item/45151446c831c017886d1033

http://www.cnblogs.com/ASPNET2008/archive/2009/04/29/1446471.html

http://blog.csdn.net/macky0668/article/details/3917878

http://www.cnblogs.com/jason-xiao/archive/2009/05/05/1450313.html

http://blog.csdn.net/cereslei/article/details/6713865

http://blog.sina.com.cn/s/blog_56d8ea900100y6nl.html
————————————————
版權聲明:本文為CSDN博主「yinyhy」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/yinyhy/java/article/details/8732118

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM