整數型別的儲存
前面 所說的位運算都沒有涉及負數,都假設這些運算是在unsingned/word型別(只能表示正數的整型)上進行操作。
但計算機如何處理有正負符號的整型呢?這個設計到補碼,反碼知識點,請看下面
假設有一 int 型別的數,值為5,那麼,我們知道它在計算機中表示為:00000000 00000000 00000000 00000101
5轉換成二進位制是101,不過int型別的數占用4位元組(32位),所以前面填了一堆0。
現在想知道,-5在計算機中如何表示?
在計算機中,負數以其正值的補碼形式表達。
什麼叫補碼呢?這得從原碼,反碼說起。
反碼,補碼
反碼和補碼的目的就是為了解決負數的問題
在計算機內,定點數有3種表示法:原碼、反碼和補碼
所謂原碼就是前面所介紹的二進位制定點表示法,即最高位為符號位,「0」表示正,「1」表示負,其餘位表示數值的大小。
反碼表示法規定:正數的反碼與其原碼相同;負數的反碼是對其原碼逐位取反,但符號位除外。
補碼表示法規定:正數的補碼與其原碼相同;負數的補碼是在其反碼的末位加1。
有原碼就可以了,為什麼還需要反碼和補碼?
反碼是用來算補碼的,原碼和補碼都是用在cpu的基本運算裡的,比如資料型別是short:
計算5 - 2,並由於實際上cpu沒有實現減法電路(注:計算機的硬體結構中只有加法器,所以大部分的運算都必須最終轉換為加法,原碼沒有辦法做減法,而在我們使用的彙編、c等其他高階語言中使用的都是原碼,原碼轉換成補碼都是在計算機的最底層進行的)。原碼計算是 5+(-2)
0101
+1010
-------
1111
=-7?顯然出錯
所以不管正數還是負數,都使用補碼來表示(正數原碼和補碼是一樣的), 2的補碼是1110,然後用5補 + 2補
0101
+ 1110
------
0011
=3,正確
認識原碼 反碼 補碼
二進位制八進位制 0000 1001 2010 3011 4100 5101 6110 7111 二進位制十六進製制 00000 10001 20010 30011 40100 50101 60110 70111 81000 91001 a1010 b1011 c1100 d1101 e1110 f...
補碼原碼反碼簡單理解
看到一句i2s的data是以補碼形式來表現資料。再次查閱得出以下只管結論 1,首先直觀舉例機器裡面是如何存放有符號數的 1在機器裡面表示為 0000 0001h 0在機器裡面表示為 0000 0000h 1在機器裡面表示為1111 1111h 2在機器裡面表示為1111 1110h 其實機器並不知道...
原碼 反碼 補碼簡單分析
原碼 signed magnitude 是一種計算機中對數字的二進位制定點表示方法。原碼表示法在數值前面增加了一位符號位 即最高位 msb 為符號位 正數該位為0,負數該位為1 0有兩種表示 0和 0 其餘位表示數值的大小。優點 簡單直觀 例如,我們用8位二進位制表示乙個數,則 11的原碼為0000...