對 128的補碼的理解

2021-06-18 02:56:34 字數 1616 閱讀 2441

今天看到乙個問-128的補碼為何就是 1000 0000的貼子.

問是如何計算出來?是不是還是按:取相應正數的原碼,最高位即符號位,取1,其餘各位取反後

整個得值 +1?

按我的理解(上學時學c語言就是這樣理解的,老譚那本書上講整數的取值範圍那段就有)

16位int  -32768至32767 -2^(16-1)至 +2^(16-1)-1

:8位二進位制的原值表達範圍為:-127至127

共有256個組合序列 0000 0000 至1111 1111 。

+128的原值在8位中是表達不出來的。

我個人的理解是:

(1)、

應當從數學層面上去理解:

從數學上計算 256-128=128, 

因為:256-128=256+(-128)的補碼

而    256-128=128

所以   256+(-128)的補碼=128

所以   (-128)的補碼=256-128

=128

而從數學上, 128=1000 0000

故規定-128的補碼為 1000 0000

所以說,128在8位記憶體中是表達不出來的。

不存在+128 8位原碼及反碼的形式,按常規演算法是不對的。

注意:只是規定而已,下面還有原因。

(2)、

8位二進位制 的補碼組合序列有

0000 0000 - 0111 1111 0  -  +127

1000 0000                   用來幹啥好呢?(表示-0,不是的,-0的原碼是1000 0000 補碼是

0000 0000  +0 的補碼也是 0000 0000)

1000 0001-  1111 1111 -1 - -127

全部狀態為256個

再看看這個規律表

原碼        補碼   值

0111 1111   0111 1111 127

0111 1110   0111 1110 126

......補碼不斷-1........

0000 0000   0000 0000  0

1000 0001   1111 1111 -1

1000 0010   1111 1110 -2

1000 0011   1111 1101 -3

......補碼不斷-1........

1111 1111   1000 0001 -127

無法表達     1000 0000 -128

於是就有了規定 1000 0000 定為 -128的補碼

這種定法和上面數學層面的表述是一致的。

這樣規定後,負數的補碼在機器中就好算了。

在約定的範圍內(-128-+127,對16位32位64位等擴大範圍)

先將該負數取絕對值,再用二進位制表示出這個絕對值 (不管符號位)

對該二進位制數進行取反加一操作就得到負數的補碼了

-128 絕對值是 128

128的二進位制表示為:

1000 0000

取反 0111 1111

加1 1000 0000

這就是-128的補碼

這種辦法算出的結果符合「規定值」,規定而已。

對 128的補碼的理解。

今天看到乙個問 128的補碼為何就是 1000 0000的貼子.問是如何計算出來?是不是還是按 取相應正數的原碼,最高位即符號位,取1,其餘各位取反後 整個得值 1?按我的理解 上學時學c語言就是這樣理解的,老譚那本書上講整數的取值範圍那段就有 16位int 32768至32767 2 16 1 至...

我對補碼的理解

計算機中用補碼表示乙個數是為了方便運算的,這樣減法也可以通過加法來實現。為什麼這樣設計行呢?主要是因為計算機里數的特殊儲存格式決定的,計算機裡用固定位數表示乙個數,超過該位置的部分會被捨棄。拿8byte的int型來說,無符號形式下,最大到1111 1111 255,超過了該範圍,會被截斷的,如 11...

128的補碼及原碼 反碼 補碼

乙個位元組佔8位 乙個字長為n的機器數能表示不同的數字的個數是固定的2 n個,n 8時2 n 256 用來表示有符號數,數的範圍就是 2 n 1 2 n 1 1,n 8時,這個範圍就是 128 127。用來表示無符號數,就不需要用一位來表示符號位,n位機器數全部用來表示是數值,這時表示數的範圍就是0...