有符號型別的最小負數的補碼的由來

2021-09-30 06:44:41 字數 2037 閱讀 2244

一、 16位的有符號整數(int)
在計算機中是用補碼儲存資料 為什麼不用原碼存 就是因為原碼表示不了最小值-32768

如果是原碼表示的話,編碼中+0是用16個0表示,-0是用1後跟15個0表示

但是由於+0等於-0所以相當於多花了乙個編碼來編碼0

那麼用補碼會怎樣

補碼+0編碼出來是16個0

-0 = [1000000000000000]原 = [1111111111111111]反 = [(1)0000000000000000]補

其中1溢位不管了 剩下的是16個0與+0編碼相同

這樣一來用16位進行編碼如果按原碼編碼可以覆蓋-32767~32767[1111111111111111~0111111111111111]

而用補碼編碼只覆蓋到[1000 0000 0000 0001 ~ 0111 1111 1111 1111]其中[1000000000000000]補 用不到

於是規定了用它表示最小值-32768

因此,在考慮16位有符號整數時,-32768只有補碼[1000000000000000],沒有原碼,只是硬性規定補碼[1000000000000000]表示

-32768
當然如果你考慮的是大於16位來編碼的話,-32768肯定能正常編碼,-32768 的正常編碼如下:
原始碼 1 1000 0000 0000 0000
反碼 1 0111 1111 1111 1111
補碼 1 0111 1111 1111 1111
+ 1
=1 1000 0000 0000 0000
所以正常的-32768的補碼應該是要17位表示,為1 1000 0000 0000 0000
二、 8位的有符號整數(int)
8位,即2^8=256,8位可以表示256個數值。
因為正數的原碼、反碼和補碼相同,即[0000 0001]補 ~ [0111 1111]補 表示正數的範圍為1到127;
+0和-0的補碼相同,都為[0000 0000]補,即都用這乙個補碼表示;
-1的補碼:[1000 0001]原=[1111 1110]反=[1111 1111]補
-127的補碼:[1111 1111]原=[1000 0000]反=[1000 0001]補
所以現在表示-127 到 127 的補碼範圍為(共255個數值):
[1000 0001]補 ~ [0111 1111]補, -127 ~ 127 之間的值的補碼就在這個補碼範圍之間。
而8位是可以表示256個數值的,即還有乙個補碼沒用到,根據上述範圍描述可知,是[1000 0000]補 沒用到。
故規定用[1000 0000]補 表示-128  -------呵呵,不浪費任何可用資源哦。
補充:
負數補碼符號位為1,再另加7位,而7位的可能排列組合為2^7=128;
同理正數的補碼符號位是0,再另加7位,7位的可能排列組合也是2^7=128;
所以,正負數補碼的可能排列組合之和就是128 + 128 = 256,與開頭計算的8位能表達的可能數值為2^8=256結果一致。
tips:
已知

[x]補

=11100110

,求[x

]原。分析如下:

對於機器數為正數,則[x]原

=[x]補

對於機器數為負數,則有[x]原

=[[x]補]補

現給定的為負數,故有:[x

]補=11100110[[x

]補]反

=10011001

十)1    [[x

]補]補

=10011010=[x

]原分析:按照求負數補碼的逆過程,數值部分應是最低位減1,然後取反。但是對二進位制數來說,先減1後取反和先取反後加1得到的結果是一樣的,故仍可採用取反加1的方法,即對於機器數為負數,則有[x]原

=[[x]補]補

。 當然你也可以用先減1後取反的方法來求補碼對應的原碼。

關於補碼 無符號及有符號型別的理解

對於數值儲存有補碼 原碼 反碼三種方式 補碼 解決負數加法運算正負零問題,彌補了反碼的不足。原碼 可直觀反映出資料的大小。反碼 解決負數加法運算問題,將減法運算轉換為加法運算,從而簡化運算規則 負值採用反碼的形式進行儲存,計算機通過第一位來判斷乙個數值是否為負數,當第一位為1時,則為負數,否之則為正...

(七)負數的補碼

我們都知道二進位制只有0和1 比如1在8 位的二進位制數字裡的原碼是 0000 0001,而7 的原碼是 0000 0111 1的原碼則為 1000 0001,其中第乙個紅色數字 1,表示負號,是符號位。如果是正數則為0,7的原碼是 1000 0111 那麼變成補碼的話,正數的補碼和原碼相同,負數的...

無符號右移負數 FPGA 中的有符號數乘法

fpga中乘法器是很稀缺的資源,但也是我們做演算法必不可少的資源。7系列及之前的fpga都是25x18的dsp,ultrascale中是27x18,我們可以通過調ip core的方式或者原語的方式來進行乘法操作。在裡面可以設定有符號還是無符號數乘法。當然,我們也可以直接使用 符合來進行乘法,對於無符...