Java中補碼的那些事

內存、顯示器、鍵盤都是非常要好的哥們,他們協同合作爲人類服務,但是人類卻對鍵盤和顯示器情有獨鍾,根本不關心內存長什麼樣子
那我們程序員寫的那些代碼,在計算機的世界裏到底是怎樣的呢?
先來看一段代碼

int i = 1;

看起來非常簡單的一段代碼,內存中是如何表示這個數字1的呢?
這裏寫圖片描述
計算機會在內存中分配一塊內存單元,大小爲4個字節(Java中),用這4個字節來表示我們想表達的數字1。那麼怎樣用這四個字節來表達這個數字1呢?就是用補碼的規則。
在看補碼之前我們先看看原碼
原碼就是將我們的數字轉化爲二進制後,用所給位數的最高位來代表正負,0代表正數,1代表負數
比如說我們用八位二進制位來表示我們的數字,那麼數字數字8,化成二進制後爲1000,不夠七位(最高位代表正負),所以可以表示,我們用0000 1000來表示數字8,而-8就是1000 1000,我們把0000 1000這樣的二進制數叫做8的原碼
我們再看補碼,補碼的計算規則是:
正數的補碼等於其原碼
負數的補碼是先求出負數的絕對值的原碼(肯定是正數),然後把全部的位取反加1,比如說-5,絕對值5,其原碼是:0000 0101(八位機)–>所有位取反:1111 1010—>加1: 1111 1011
現在我們再來看變量i, 變量 i 所代表的內存中存的我們認爲的數字1就是以1的補碼存儲的,由於1是正數,所以原碼等於補碼,又因爲這個1是一個int型數據,所以它佔4個字節32位(Java中),所以它在內存中是這樣表示的
這裏寫圖片描述
那麼-1是在內存中是什麼樣?相信大家會算了,根據補碼計算規則,是:1111 1111 1111 1111 1111 1111 1111 1111;
我們寫一個小demo測試一下:

int i = -1;
System.out.println(i>>>24);// ">>>" 爲邏輯右移,在左端補k個0(直接操作的是內存,這個也就是操作的是補碼)

輸出結果爲:255
1111 1111 1111 1111 1111 1111 1111 1111 —> 邏輯右移24下,把整體往右移24次(每次一位),左邊的補0 —>0000 0000 0000 0000 0000 0000 1111 1111 —>這個補碼爲正數,正數的補碼等於其原碼,也就代表了255
總結: 內存中的數是以數字的補碼存在的,而顯示屏上顯示的數字是我們人想要表達的

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章