關於原碼1000 0000,表示的是-0,還是-128呢?(答案是-128而不是-0)
1.先看看原碼的概念吧:正數的符號位為0,負數的符號位為1,其它位按照一般的方法來表示數的絕對值
2.0是負數嗎?0既不是正數也不是負數,那麼它的符號位到底是0還是1呢?(0的符號位為0,不能為1)
3.看看負數補碼的公式:負數的補碼=10000 0000(模)-數的絕對值
比如:
-1的補碼=1111 1111 =10000 0000-0000 0001
-2的補碼=1111 1110 =10000 0000-0000 0010
現在假設-0為負數,那麼-0的補碼應該是10000 0000 - 0(這個0,姑且教0的絕對值吧)=0000 0000
反碼:1111 1111(0000 0000 -1=0000 0000 +1111 1111=1111 1111)
原碼:1000 0000
現在來推-128
-128的補碼:10000 0000 - 1000 0000(+128沒有符號位)=1000 0000
反碼:1111 1111(1000 0000 -1=1000 0000+1111 1111=1111 1111)(補碼-1)
原碼:1000 0000(反碼取反)
從上面看來,乙個原碼對應了2個補碼
但是仔細分析:原碼的概念,負數的符號位為1,但是0不是負數,所以不能用此公式
0也不是正數,但是可以把0定義為原碼、反碼和補碼都一樣(即0000 0000)
而且據說可以推斷出0的補碼只有乙個(有興趣的 可以去推一下,呵呵)
現在原碼1000 0000就唯一表示-128了,而不會表示出-0,因為-0不能用這個公式計算
現在,補碼1000 0000的原碼是1000 0000(已證明),那麼原碼1000 0000的補碼是1000 0000嗎?
原碼 1000 0000 (-128,進製被捨去)
反碼 1111 1111
補碼 1000 0000(1111 1111(反碼) + 1=1000 0000,這裡實際上真正相加的是1111 1111後面的7位,
第1位是符號位始終不會變,所以,當進到第8位的時候,就表示溢位了,會被捨棄)
2.綜上所述:
1.-128的補碼和原碼一樣都是1000 0000,
2.0的原碼、反碼和補碼都一樣(即0000 0000)
3.如果把-0當做負數,1000 0000就會有歧義(事實上0的補碼只有乙個0000 0000)
128的補碼及原碼 反碼 補碼
乙個位元組佔8位 乙個字長為n的機器數能表示不同的數字的個數是固定的2 n個,n 8時2 n 256 用來表示有符號數,數的範圍就是 2 n 1 2 n 1 1,n 8時,這個範圍就是 128 127。用來表示無符號數,就不需要用一位來表示符號位,n位機器數全部用來表示是數值,這時表示數的範圍就是0...
原碼和補碼
1 1 正數3碼合一 原碼0000 0001 1000 0001 最高位0表示正數,1表示負數。原碼計算得原碼 反碼0000 0001 1111 1110 除最高位之外取反,反碼計算得反碼 補碼0000 0001 1111 1111 反碼 1,符號位不變,符號位只在兩個補碼運算時改變,補碼計算得補碼...
原碼和補碼
我不想介紹什麼原碼和補碼的概念,只是為了自己重拾程式設計的一點小積累。原碼 原碼表示法在數值前面增加了一位符號位 即最高位為符號位 正數該位為0,負數該位為1 0有兩種表示 0和 0 其餘位表示數值的大小。正數的原碼為其本身,負數的原碼是取絕對值後將最高位變1 如何計算補碼呢?正數的補碼為其本身 負...