C筆記 原碼 反碼 補碼

2022-09-02 12:48:11 字數 1793 閱讀 7359

機器數

1 - 乙個數在計算機中的二進位制表示形式, 叫做這個數的機器數

2 - 機器數是帶符號的,在計算機用乙個數的最高位存放符號,正數為 0,負數為 1

如十進位制數 +3 ,計算機字長為 8 位,轉換成二進位制就是 0000 0011

如十進位制數 -3 ,就是 1000 0011(0000 0011和1000 0011就是機器數)

真值1 - 因為有符號位,所以機器數的形式值就不等於真正的數值

例如有符號數 1000 0011,其最高位 1 代表負,其真正數值是 -3 而不是形式值 131

2 - 為區別起見,將帶符號位的機器數對應的真正數值稱為機器數的真值

0000 0001 真值是 +000 0001 == +1

1000 0001 真值是  –000 0001 == –1

原碼1 - 原碼就是符號位加上真值的絕對值

2 - 第一位表示符號,其餘位表示值。

如 +1 == 0000 0001,-1 == 1000 0001

反碼1 - 正數的反碼是其本身

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

如  +1 == 0000 0001(原)== 0000 0001(反)

-1 == 1000 0001(原)== 1111 1110(反)

補碼1 - 正數的補碼就是其本身

2 - 負數的補碼是在其原碼的基礎上,符號位不變,其餘各位取反,最後 +1(實際上是在反碼的基礎上 +1)

如  +1 == 0000 0001(原)== 0000 0001(反)== 0000 0001(補)

-1 == 1000 0001(原)== 1111 1110(反)== 1111 1111(補)

3 - 溢位問題

1 - 由於計算機中的數字用補碼表示,例如 8 位的 byte 型別的表示範圍為:[-128, 127]

補碼和原碼、反碼不同,沒有 +0 和 -0 一說,只有乙個 0

原碼、補碼存在 +0 和 -0,取值範圍 [-127,127]

如 0 == 0000 0000(補)    -128 == 1000 0000(補)   127 == 0111 1111(補)

2 - 當 byte 型別的變數超上限127時

① 128 == 127 + 1 

== 0111 1111(補)+ 0000 0001(補) 

== 1000 0000(補) 

== -128

② 129 == 127 + 2 

== 0111 1111(補)+ 0000 0010(補) 

== 1000 0001(補) 

== -127

3 - 當 byte 型別的變數超過下限 -128 時

① -129 == -128 - 1 

== 1000 0000(補) - 0000 0001(補) 

== 0111 1111(補) 

== 127

② -130 == -128 - 2 

== 1000 0000(補) - 0000 0010(補) 

== 0111 1110(補) 

== 126

4 - 關於補碼溢位的問題,可用一張圖來描述(以 8 bit 為例)

小結0 原碼 | 反碼 | 補碼 都是 0000 0000

-0  原碼是 1000 0000,反碼是

11111111

128 和 -128 補碼相同 1000 0000

C 筆記 原碼 反碼 補碼

數值在計算機中是以補碼的方式儲存的,在探求為何計算機要使用補碼之前,讓我們先了解原碼,反碼和補碼的概念。對於乙個數,計算機要使用一定的編碼方式進行儲存。原碼,反碼,補碼是計算機儲存乙個具體數字的編碼方式。乙個數在計算機中的二進位制表示形式,叫做這個數的機器數。機器數是帶符號的,在計算機用乙個數的最高...

原碼 反碼 補碼

正數 原碼 反碼 補碼一樣 7 原 0 0000111 b 7 反 0 0000111 b 7 補 0 0000111 b 負數 原碼就是原來的表示方法 反碼是除符號位 最高位 外取反 補碼 反碼 1 7 原 1 0000111 b 7 反 1 1111000 b 7 補 1 1111001 b 當...

原碼 反碼 補碼

正數 原碼 反碼 補碼一樣 7 原 0 0000111 b 7 反 0 0000111 b 7 補 0 0000111 b 負數 原碼就是原來的表示方法 反碼是除符號位 最高位 外取反 補碼 反碼 1 7 原 1 0000111 b 7 反 1 1111000 b 7 補 1 1111001 b 當...