原碼,反碼和補碼的一些小問題

2021-10-02 14:58:43 字數 4225 閱讀 7291

為什麼補碼等於反碼加一?為什麼補碼中有符號位,只能表示最大正數補碼+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 有跳變為 ...