今天看到乙個問-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...