計算機中的-2就是11111110b,而數學上的-2無法在計算機中直接存儲,因此就有個算法來計算應該怎麼存儲。就是正數的反碼+1,由於這個數正好加上原來的正數=0(溢出部分無論)
html
首先,你要理解,計算機裏面沒有負數的概念,全部數都是無符號數。可是邏輯上有負數,怎麼辦呢?讓他計算正確就OK了,那麼負數就成正數取反+1了程序員
你別太關心啥補碼,反碼的。容易搞暈。
計算機裏面。你關注哪一個無符號數+2正好溢出,那麼那個數就是-2,由於他+2=0算法
因此別把數學上直接搬上來套,越搞越暈。
反正個人理解就是計算機裏面根本就無論你負數啥的,全是無符號數,只是爲了讓咱們更加方便的處理數學問題,引入了符號位這些概念編程
算算補碼怎麼來的吧。
2=00000010b,而後取反11111101b+1=11111110b操作系統
-2=0xFFFFFFFE,你無論算數右移多少次都是-1debug
說了,計算機無論你有符號無符號的。計算結果的最高爲是1,就會給你設置SF,至於你去不去看SF是你的事情; 設計
---------------------------------------------------------------------------------htm
QQ:149955923內存
若是你聲明一個負數變量,計算機會將你這個變量變成2進制,而後取反+1get
計算機在底層微電子元件中沒有設計負數的電路,因此用正數的補碼來表示負數
計算機中的-2就是11111110b,而數學上的-2無法在計算機中直接存儲,因此就有個算法來計算應該怎麼存儲。就是正數的反碼+1,由於這個數正好加上原來的正數=0(溢出部分無論)
網友推薦的書:
巨神之碑文(149955923)
我推薦Intel彙編程序設計 講的很是詳細
黑無止境(546515315)
我推薦天書夜讀,裏面有C語言在內存中的貯存方式
黑無止境(546515315)
還有一本 深刻理解計算機體系結構 這本書講的是從C語言程序員的角度去看待操做系統的內存結構
---------------------------------------------------------------------------------------------------------
轉自:http://zhidao.baidu.com/question/51147577.html?fr=ala0
問:二進制負數的補碼的原理
爲何要用補碼的形式改更負數
如何掌握它的用法?
一、在計算機系統中,數值一概用補碼來表示(存儲)。
主要緣由:使用補碼,能夠將符號位和其它位統一處理;同時,減法也可按加法來處理。另外,兩個用補
碼錶示的數相加時,若是最高位(符號位)有進位,則進位被捨棄。
二、補碼與原碼的轉換過程幾乎是相同的。
數值的補碼錶示也分兩種狀況:
(1)正數的補碼:與原碼相同。
例如,+9的補碼是00001001。
(2)負數的補碼:符號位爲1,其他位爲該數絕對值的原碼按位取反;而後整個數加1。
例如,-7的補碼:由於是負數,則符號位爲「1」,整個爲10000111;其他7位爲-7的絕對值+7的原碼
0000111按位取反爲1111000;再加1,因此-7的補碼是11111001。
經以上整合,本身得結論以下:
(1) -4 >> 1 結果是-2;
(2) -4 >>2 結果是-1;
計算過程以下:
4的原碼:0x0000 0004;==>除符號位0外,其餘按位取反加1===>(符號位變爲1),得:
-4的補碼是:0xFFFF FFFC;
那麼-4進行右移1位,得:0xFFFF FFFE;(這個再進行取反加一,便可獲得它的整數值爲-2);--一個負數的補碼,再次進行求補碼則可還原其原碼;
也可經過debug.exe來查看-4的補碼是多少
cmd==>debug
==>a命令
==>mov ax,-4
==>回車,再回車
==>t
便可查看到ax=FFFC (即計算機裏是以補碼形式進行存儲負數)