1. 程式人生 > >C語言之原碼、反碼和補碼

C語言之原碼、反碼和補碼

加法 num 它的 類型 什麽 取反 表示 不同的 情況

原碼、反碼和補碼

1).數據在內存中存儲的時候都是以二進制的形式存儲的.

int num = 10;

原碼、反碼、補碼都是二進制.只不過是二進制的不同的表現形式.

數據是以補碼的二進制存儲的.

2). 1個int類型的變量.在內存中占據4個字節, 32位.

00000000 00000000 00000000 00000000

在不考慮正負的情況下.1個int類型的變量可以表示接近43e種數據.

為了可以表示正負性.使用最高為來表示這個數的正負性.

如果最高為是0 那麽表示這個數是1個正數

如果最高為是1 那麽表示這個數是1個負數.

所以,來表示數據的只有31位. 所以,1個int類型的變量.

最小值是: -2147483648 最大值是:2147483647

3). 原碼

最高位表示符號位. 剩下的位數.是這個數的絕對值的二進制.

10的原碼.

00000000 00000000 00000000 00001010

-8的原碼.

10000000 00000000 00000000 00001000

絕對值: 正數的絕對值是自己,負數的絕對值去掉負號.

-20.

10000000 00000000 00000000 00010100

4). 反碼

正數的反碼就是其原碼.

負數的反碼就是在其原碼的基礎之上 符號位不變,其他位取反.

10的反碼:

10的原碼:00000000 00000000 00000000 00001010

10的反碼:00000000 00000000 00000000 00001010

-8

-8的原碼:10000000 00000000 00000000 00001000

-8的反碼:11111111 11111111 11111111 11110111

5). 補碼

正數的補碼就是其原碼.

負數的補碼就是在其反碼的基礎之上+1

10.

10的原碼:00000000 00000000 00000000 00001010

10的反碼:00000000 00000000 00000000 00001010

10的補碼:00000000 00000000 00000000 00001010

-8

-8的原碼:10000000 00000000 00000000 00001000

-8的反碼:11111111 11111111 11111111 11110111

-8的補碼:11111111 11111111 11111111 11111000

6). 任何數據都是以其二進制的補碼形式存儲在內存中的.

int num = -8;

7). 為什麽數據要以補碼的形式存儲呢?

計算機中只有加法沒有減法.為了更加低成本的計算出結果,所以使用補碼來存儲數據.

3 + 2;

3 - 2; 這個減法運算對於計算機而言它的理解是 3 + (-2); 1

使用原碼計算.

3的原碼 00000000 00000000 00000000 00000011

-2的原碼 10000000 00000000 00000000 00000010

----------------------------------------------------

10000000 00000000 00000000 00000101 結果是1個負數明顯是不對的

使用反碼計算.

3 的反碼: 00000000 00000000 00000000 00000011

-2的反碼: 11111111 11111111 11111111 11111101

--------------------------------------------------

00000000 00000000 00000000 00000000 0

使用補碼計算

3 的補碼: 00000000 00000000 00000000 00000011

-2的補碼: 11111111 11111111 11111111 11111110

-------------------------------------------------

00000000 00000000 00000000 00000001 1

註:使用補碼來做運算效率是最高的.

C語言之原碼、反碼和補碼