原碼補碼反碼

2021-10-02 06:45:04 字數 3351 閱讀 4076

原碼(使用者的角度):原始的二進位制

1、使用者的數字分為正負數,符號位的儲存

2、最高位為符號位:0代表為正數,1代表為負數

3、1000

0000 左邊是高位, 右邊是低位

1,+1: 0000

0001

-1: 1000

0001

+0: 0000

0000

-0: 1000

0000

原碼儲存導致2個問題:

1、0有兩種儲存方式

2、正數和負數相加,結果不正確(計算機只會加不會減)

以原碼來算

1-1=1+-

11: 0000

0001

-1: 1000

0001

1000

0010=-

2

反碼(為了算補碼):

1、正數的原碼和補碼一樣

2、求原碼

3、(負數)在原碼的基礎上,符號位不變,其它位取反(0變1, 1變0)

1,+1: 0000

0001

-1: 1111

1110

+0: 0000

0000

-0: 1111

1111

反碼儲存導致1個問題:

1、0有兩種儲存方式

以反碼來算:

1-1=

1+-1

1: 0000

0001

-1: 1111

1110

1111

1111=-

0計算機儲存數字以補碼方式儲存(為了解決負數的儲存)

補碼:

1、正數的原碼、反碼、補碼都一樣

2、補碼為其反碼+

13、補碼符號位不動,其它位求反,最後整個數+

1,得到原碼

1,+1: 0000

0001

-1: 1111

1111

+0: 0000

0000

-0:10000

0000 (最高位丟棄)=

0000

0000

以補碼來算:

1-1=

1+-1

1: 0000

0001

-1: 1111

1111

10000

0000(最高位丟棄) =

0000

0000

10進製數,站在使用者的角度,原碼

二進位制、八進位制、十六進製制數,站在計算機角度,補碼

在計算機系統中,數值一律用補碼來儲存,主要原因:

1.統一了0的編碼

2.將符號位和其他位統一處理

3.將減法運算轉變為加法運算

4.兩個用補碼表示的數相加,如果最高位(符號位)有進製,則進製被捨棄

原碼求補碼:

1)最高位符號位,其它位就是二進位制(原碼)

2)在1)基礎上,符號位不變,其它位取反

3)補碼在2)基礎上加1

補碼求原碼:

1)補碼

2)求補碼的反碼,符號位不變,其它位取反

3)原碼在2)基礎上加1

例: //乙個位元組

1000

0001

0x81

//二進位制、八進位制、十六進製制數,站在計算機角度,補碼

//0x81轉化為二進位制1000 0001,最高位為1,說明是負數

char a = ox81;

補碼:1000

0001

反碼:1111

1110

原碼:1111

1111=-

127//10進製數,站在使用者的角度,原碼

printf

("%d\n"

, a)

;// -127

//10進製數,站在使用者的角度,原碼

int a =

-123

; 原碼:1000

0000

0000

0000

0000

0000

0111

1011

反碼:1111

1111

1111

1111

1111

1111

1000

0100

補碼:1111

1111

1111

1111

1111

1111

1000

0101

%x: f f f f f f 8

5//%x, 預設以4個位元組(32bit)大小列印

//二進位制、八進位制、十六進製制數,站在計算機角度,補碼

printf

("%x\n"

, a)

;// ffffff85

資料型別範圍(站在10進製角度,原碼)

char

1個位元組(8位)

有符號範圍:

正數:0000

0000

~0111

11110~

127 負數:

1000

0000

~1111

1111-0

~-127-

0 當做 -

128 使用

-128:

原碼: 1

1000

0000

反碼: 1

0111

1111

補碼: 1

1000

0000

-128

~127

無符號:

0000

0000

~1111

11110~

255char:

有符號:-

128~

127無符號: 0

~255

賦值或則越算,記得不要越界:

char ch =

127+2;

/* 129:

補碼:1000 0001

反碼:1111 1110

原碼:1111 1111

*/4[

printf

("%d\n"

, ch)

;// -127

unsigned char b =

255+2;

//257轉化為二進位制 0001 0000 0001 (只取8位)0000 0001 --> 1

printf

("%u\n"

, b)

;// 1

原碼 反碼 補碼

正數 原碼 反碼 補碼一樣 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 當...

原碼 反碼 補碼

數值在計算機中表示形式為機器數 計算機只能識別0和1,使用的是二進位制,而在日常生活中人們使用的 是十進位制,正如亞里斯多德早就指出的那樣,今天十進位制的廣泛採用,只不過我們絕大多數人生來具有10個手 指頭這個解剖學事實的結果.儘管在歷史上手指計數 5,10進製 的實踐要比二或三進製計數出現的晚.摘...