首頁>Club>
5
回覆列表
  • 1 # 老狼99011223

    不久之前,因為做專案遇到了不少客戶的資料為負數的,由於資料傳輸的關係,需要將負數的值傳給客戶,因此,接觸到了一種非常不錯的計算負數補碼的方法,下面想總結一下這個方法的原理,方便自己記憶。

    話不多說,先上結論:

    負數的補碼 = (負數+ 2的資料數量次方)取二進位制

    例子:一個位元組數資料,-2-2的補碼 = -2 + 2^8 = 11111110

    通用計算方法

    眾所周知,補碼與原碼,反碼的關係如下:

    1、正數的原碼 = 正數的反碼 = 正數的補碼2、負數的原碼 = 對應正數的原碼 + 2的資料位數量次方,最高位作為符號位3、負數的反碼 = 負數的原碼的符號位不變,其他資料取反4、負數的補碼 = 負數的反碼+1

    計算原理

    把有符號位的負數,當作無符號數來表示,就可以知道,對於取反操作來說,負數的原碼取反 = 2的資料位數量次方 - 負數原碼 - 1

    以一個位元組為例:-1的反碼 = 1取反 = 2^8 - 1 - 1 = 1111 1110-2的反碼 = 2取反 = 2^8 - 2 - 1 = 1111 1101-3的反碼 = 3取反 = 2^8 - 3 - 1 = 1111 1100(以此類推)-128的反碼 = 128取反 = 2^ 8 - 128 -1 = 1000 0000

    其實透過上面的羅列就可以清楚的知道為什麼了,因為對於2進位制來說,負數實際上就是對應正數的原碼+2的資料位數量次方作為符號位,同時由於正數的補碼,原碼,反碼當作無符號位時,計算方式和負數是一致的,其差值恰好為2的資料位數量次方。

    如果是一個位元組,就是2的8次方如果是兩個位元組,就是2的16次方如果是三個位元組,就是2的24次方如果是四個位元組,就是2的32次方

    由此可見,熟悉了有符號數和無符號數的關係之後,就不需要再透過取反+1這種操作來計算負數以及負數的補碼了,只需要透過普通的計算即可

  • 中秋節和大豐收的關聯?
  • 怎樣才能寫好字?