深入理解计算机底层为什么采用补码运算【如何理解二进制计算高位溢出】
在計算機底層運算設計的過程中,是根據現實生活中的數學運算做出的映射。比如數學中的8-3=8+(-3),那么這樣一來減法運算就變成了加法運算(你這時可能會問,我腦子直接計算8-3=5了,何必再轉換位成加法運算多此一舉,只能說你日常形成習慣了吧!因為對8-3做分解就只有8和-3這兩部分,所以在數學中就是8和-3做相加),因此計算機底層設計模擬數學就需要負數,這個負數就可以使用反碼進行充當–》本質上是為了將減法運算轉換為加法運算。補碼是為了解決數字“0”在計算機中非唯一編碼的問題。為什么會這樣,往下看!
Computer_Base__Binary_List:
- 1.為什么計算機內部只有加法器?
- 2.計算機為什么會需要原碼、反碼、補碼?
- 3.如何理解二進制計算高位溢出?
1.為什么計算機內部只有加法器?
我們都知道計算機芯片內部有個核心部件-晶體管,但你知道它的作用嗎?作用很多,此處列舉一個與本文相關的。
通過三極管的拼接可以完成邏輯的運算,制造出了與非門。(至于為什么本文不做探討)
(1)與門:兩個輸入端和一個輸出端,當輸入端都為高電平(1)時,才能輸出高電平(“&”)
(2)非門:一個輸入端和一個輸出端,當輸入端為高電平(1)時,輸出端為低電平,“非”也就是相反的意思。(“!”)
(3)或門:兩個輸入端和一個輸出端,當某一個輸入端為高電平(1),那么輸出端就為高電平。(“|”)
最終通過與門、非門、或門的有機結合創造出了加法器。有了加法器還要解決減法器的問題,這個減法器的設計更為困難(比如加法器可以使用“與”來完成進位),所以為了硬件電路變得簡單,我們可以通過加法器實現減法器的功能。這就涉及到了補碼。
2.計算機為什么會需要原碼、反碼、補碼?
二進制第一位一般會表示成符號位,0正,1負二進制第一位一般會表示成符號位,0正,1負二進制第一位一般會表示成符號位,0正,1負
🌹(1)原碼
將一個整數轉換為二進制形式就是其原碼。
比如byte a = 3;那么a的原碼就是0000 0011
比如short a = 3;那么a的原碼就是0000 0000 0000 0011
比如int a = 3; …
如何理解不同類型等到二進制位數呢?
一個byte占1個字節(一個字節也就是8位二進制數)
一個short int 占用2個字節(也就是16位二進制數)
一個int 占用4個字節(也就是32位二進制數)
…
總結:簡單了說原碼就是一個整數的二進制形式。
🌹(2)反碼
對于正數,它的反碼和原碼相同。
比如short a = 3, 它的反碼=原碼=0000 0000 0000 0011
對于負數,它的反碼是將原碼中除了符號位以外的所有位進行取反獲得。(也就是0變1,1變0)
比如short a = -3,那么它的原碼是1000 0000 0000 0011,它對應的反碼是1111 1111 1111 1100.
有了原碼為什么還會需要反碼呢?
這就類似于數學中的4-2=4+(-2),反碼相當于負數,可以將減法變成加法。
🌹(2)補碼
有了反碼為什么還需要補碼呢?
這其實是因為0這個模糊的概念造成的。8位二進制反碼表示的正數范圍為(0000 0000 ~ 0111 1111,高位為符號位),也就是+0~127;8位二進制反碼表示的負數范圍為(1000 0000 ~ 1111 1111),也就是-127 ~ -0。
其中涉及到了兩個特殊的編碼+0和-0。由于計算機中的編碼是唯一的,所以需要解決這個問題。
官方給出的解決方案是正數范圍保持不變,負數范圍整體向后移動一位,也就是反碼+1.(所以負數范圍就變成了128~-1)
有位大佬說的很貼切,這種操作好像是在反碼上打了“補丁”,修正了一下,所以稱之為補碼。
這樣一來補碼就很清晰了
正數的補碼和原碼一致
負數的補碼=反碼+1
總結:補碼是為了解決數字“0”在計算機中非唯一編碼的問題。
3.如何理解二進制計算高位溢出?
這就是涉及到了模運算。
很多技術朋友都是列舉的是時鐘的例子,可能這個比較容易理解吧!
假設當前時鐘指向4點,怎么將它指向2點呢?
1.直接向后撥動兩位到2點【4-2=2】
2.向前撥動十位就到2點了【(4+10)mod 12】
從以上我們可以看出-2和10在數學上互為補數
所以可以總結出
A-B=(A+B補)mod N(N表示極限值)
看下面的二進制補碼計算溢出的情況
4-3=? 【假設這兩個都是byte類型,也就是一個字節,8位二進制數】
4的補碼為0000 0100
-3的補碼為1111 1101
相加之后為1 0000 0001,可以看出已經超出了byte的-128~127的范圍,由于存儲限制,進位1會被丟棄。
最終的結果0000 0001,對應的十進制也就是1,剛好滿足結果,你可能會有疑問為什么這么巧呢?
原因如下:
這就類似于上面涉及到的模運算,1 0000 0000剛好是該byte的極限值,由于計算機存儲的限制,所以會將高位1進行舍棄。其值就是0.
對于-3我們可以理解為0-3,0-3對應的二進制也就是1 0000 0000 - 0000 0011 = 1111 1101 = -3的反碼 + 1 = -3的補碼。
另外也可也可以利用上面的mod進行理解這個溢出。
總結
以上是生活随笔為你收集整理的深入理解计算机底层为什么采用补码运算【如何理解二进制计算高位溢出】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【JVM调优工具篇】使用JProfile
- 下一篇: 实验4 贪心法(作业调度问题)