為什麼補碼等於反碼加一?為什麼補碼中有符號位,只能表示最大正數補碼+127,卻能表示最大正數-128呢?計算機中怎麼對待符號位的?
二、反碼
2.數學定義:
3.意義:
4. 注意點:1.計算機中無反碼。
三、補碼
四、計算機中對數的儲存於處理
原碼(true form)是一種計算機中對數字的二進位制定點表示方法。原碼表示法在數值前面增加了一位符號位(即最高位為符號位):正數該位為0,負數該位為1(0有兩種表示:+0和-0),其餘位表示數值的大小。
其中,負數時,2^(n-1)相當於負號。其二進位制為:1000 0000(b)
理解:為了表達負數,引入原碼。如何表達負數?將n位二進位制中最高位人為記為符號位。
故,8位二進位制中,範圍為 -127 ~ 127;
1111 1111(原)= -127;
0111 1111 (原)= +127;
可以直接知正負和轉化為十進位制數。
1.有兩個0;
乙個+0 即 0000 0000(原);
乙個-0 即 1000 0000(原)。
2.無法實現減法(異號數相加)計算。
例如:-1 + 1 = 0
1000 0001 (原) + 0000 0001(原)= 1000 0010(原)= -2
可以說是人們為了表達正負數,引入了原碼概念。
反碼是數值儲存的一種,多應用於系統環境設定,如linux平台的目錄和檔案的預設許可權的設定umask,就是使用反碼原理。
沒學到,不太懂。
不過反碼是相對於原碼存在的,且幫助得到補碼。
簡單定義:反碼跟原碼是正數時,一樣;
負數時,反碼就是原碼符號位除外,其他位按位取反。
如:1001 0010(原)= - 18 的反碼是 1110 1101(反)= 109
按位取反也可以看成,絕對值最大數 - 原碼絕對值。
即 (1)111 1111 - (1)001 0010 = (1)110 1101 (符號不變)
1.反碼通常是用來由原碼求補碼或者由補碼求原碼的過渡碼。
換個角度,似乎如果沒有反碼,不影響原碼和補碼互轉化啊。
2.為了解決「正負相加等於0」的問題,在「原碼」的基礎上,人們發明了「反碼」
「反碼」表示方式是用來處理負數的,符號位置不變,其餘位置相反。
例如:-1 + 1 = 0
1000 0001 (原) + 0000 0001(原)= 1000 0010(原)= -2
1111 1110(反) + 0000 0001(反) = 1111 1111(反)= 1000 0000(原)= -0
這不就實現了減法?
再來一例:-14 + 12 = -2
1000 1110 (原) + 0000 1100(原)
1111 0001 (反)+ 0000 1100(反) = 1111 1101(反) = 1000 0010(原)= -2
真的?14 - 12 = 2
0000 1110 (原 ) + 1000 1100(原)
0000 1110(反)+ 1111 0011(反)= 0000 0001(反) = 0000 0001(原) = 1
其實在這時存在著乙個溢除單位,第一位為0,第二次為1,所以結果反碼也許應該加上進製。這樣可以解決反碼運算問題。但是不夠適用,仍然有進製
2.而且,反碼中仍然存在著-0 = 1000 0000 (原)其反碼 1111 1111(反)
「模」是指乙個計量系統的計數範圍,如過去計量糧食用的鬥、時鐘等。計算機也可以看成乙個計量機器,因為計算機的字長是定長的,即儲存和處理的位數是有限的,因此它也有乙個計量範圍,即都存在乙個「模」。
生活中處處有模的存在,例如鐘錶計時,假設現在時針指向數字8,如要把時針調到指向5,(順時針為正)則可以:
1 將時針逆時針撥動3格。
2.將時針順時針撥動(8+12 - 3)格。
兩者的結果是一樣的。這裡稱12為「模」,而稱+9是(-3)以12為模的補數,。
故有 8 -3= 8+ (12 -3) ,這裡可以看到將減法轉換成加法的過程,即「加上模減去絕對值的差」。
注意補數定義:
負數的補數:模減去該負數的絕對值,
正數的補數:是本身。0的補數是0
同理,還有度數的360等等。
所以在計算機中,原數叫原碼,那麼補數就叫補碼。
在計算機系統中,數值一律用補碼來表示和儲存。原因在於,使用補碼,可以將符號位和數值域統一處理;同時,加法和減法也可以統一處理
想必大家都明白,對原碼按位取反(除符號位),然後加1的原則。
想過為什麼加1嗎?
根據上述補數的介紹,8位進製(有一位做了符號位,本質只有 -127 ~ 127),
模是1 0000 0000。
例:-10 的 1000 1010(原) 1111 0101(反) 1111 0110(補)
同時模 - 原碼(絕對值) = 補碼
1 0000 0000(模)- 0000 1010 (原絕對值)= 1111 0110 (補)
具體步驟如下:
1 0000 0000(模) = (1111 1111 + 0000 0001) - 0000 1010(原絕對值)
=(1111 1111 - 0000 1010 ) + 0000 0001
= 1111 0101(反)+ 0000 0001 (反碼 + 1 )
= 1111 0110(補)
那麼模 - 原碼(絕對值) = 反碼 + 1 = 補碼原碼是正數,補碼是本身,0的補碼是0 。如此以來巧妙使符號不影響結果,又能實現區別正負。但這時反碼似乎沒什麼作用。只要找到模,理解模 - 原碼(絕對值) = 補碼,就可以較快速得到原碼和補碼的轉換,似乎可以丟了反碼。
注意:如果用按位取反,加一原則,你是無法得到 -128 這個原碼的。
因為 -128 補碼是 1000 0000,如果減一(0000 00001)= 0111 1111(反)
按位取反 0000 0000(原),這不是0嗎?
但是,這樣,原碼(1000 0000),模(1 0000 0000)- 原碼 = 1000 0000 (補碼)
原碼(1000 0000)是-0,這個歷史遺留。但是記住,計算機儲存中無原碼。準確來說是沒有符號位,那麼這個原碼可以理解為
-128是乙個負數,所以它的補碼是它的「模」減去它的絕對值,即:
1 0000 0000 - 1000 0000 = 1000 0000(補)。
還有這種理解
2。模的確定。計算機中由於多乙個符號的理解。所以,
4 位二進位制數的模是 2^4=16,
8 位二進位制數的模是 2^8=256,
16 位二進位制數的模是 2^16=65536,
32 位二進位制數的模是 2^32。
簡單來說就是無符號數字。
如果是 unsigned char ,計算機的乙個指令認為最高位,不代表符號。
如果是char, 計算機的另乙個指令認為最高位是符號位,0為正,1為負。
因為補碼和無符號數運算統一,
不存在原碼,反碼儲存。
優秀指導文章:原碼、反碼、補碼的產生、應用以及優缺點有哪些?
2023年02.12 家
乙個有關原碼 反碼 補碼的小問題
int x 1 y x 求y的值。我開始算出結果為e,不過這個結果是錯的。思路 因為計算機是以二進位制的補碼的形式來儲存,所以我們要將 1 轉換成補碼,又因為補碼是在反碼的基礎上轉換而來,而反碼又是原碼轉換來的,所以得將 1 裝換成原碼。以下是正確演算法 1 原 00000001 1 原 11111...
原碼 反碼 補碼和 2147483648的補碼表示
在網上看到乙個挺奇怪的說法 乙個整數的原碼是這個數的絕對值的原碼,然後他就得出了 00000000 00000000 00000000 00000101 是 5的 原碼 然後他又說反碼就是32位的每一位都取反 比如 將00000000 00000000 00000000 00000101每一位取反,...
一些小問題
1 曼徹斯特編碼和差分曼徹斯特編碼。曼徹斯特編碼,常用於區域網傳輸。在曼徹斯特編碼中,每一位的中間有一跳變,位中間的跳變既作時鐘訊號,又作資料訊號 從高到低跳變表示 1 從低到高跳變表示 0 還有一種是差分曼徹斯特編碼,每位中間的跳變僅提供時鐘定時,而用每位開始時有無跳變表示 0 或 1 有跳變為 ...