轉載請標明地址 QuincySx:www.jianshu.com/p/f134b15ff…
原碼、反碼、補碼是什麼
數字最早被我們在自然界抽象出來的時候本沒有正負之分,比如一個人,兩個人,三個人。沒有負一個人之說
那麼在計算機表示數字的時候也是沒有正負之分,現在我們假設計算機是用 1 位元組也就是 8 bit 來儲存資料,那麼數字 1、2 再計算機中如何表示呢
//無符號
1 -> 0000 0001
2 -> 0000 0010
複製程式碼
想必大家都知道現階段我們使用的計算機資料儲存運算都是二進位制資料
到了後來在我們生活中為了表示“你欠我錢”等等這個概念,所以劃分出了『正數』、『負數』
那麼相應的計算機世界就出現了 原碼 這個概念
原碼:把最左邊的一位騰出來表示正負,0 表示正數,1 表示負數
//原碼
+1 -> 0000 0001
+2 -> 0000 0010
-1 -> 1000 0001
-2 -> 1000 0010
複製程式碼
當計算機世界發明了原碼之後出現一個棘手的問題,就是自然界中 1 + (-1) = 0 而計算機的計算結果呢 00000001 + 10000001 = 10000010 (-2) 咦這個結果可不對啊,怎麼辦呢
所以聰明的人類又給計算機世界發明了 反碼
反碼:正數的反碼與其原碼相同,負數的反碼是符號位不變其他位取反
//反碼
+1 -> 0000 0001
+2 -> 0000 0010
-1 -> 1111 1110
-2 -> 1111 1101
複製程式碼
這個問題解決了但是又出現了一個新的問題,00000001 + 11111110 = 11111111 (-0) 這樣一來在計算機中出現了兩個 0 這可不行
//反碼
+0 -> 0000 0000
-0 -> 1111 1111
複製程式碼
怎麼辦呢,人們又為計算機世界貢獻了 補碼 的概念
補碼:正數的補碼與其原碼相同,負數在反碼的基礎上 +1
//補碼
+1 -> 0000 0001
+2 -> 0000 0010
-1 -> 1111 1111
-2 -> 1111 1110
複製程式碼
這樣一來 00000001 + 11111111 = 1 0000 0000 可是位數超了可是我們的儲存空間就 8 bit 怎麼辦呢,所以就捨去 1 保留 00000000 (0)
這樣一來就完美了,在計算機世界中進行資料運算就和我們的規則就統一了
小結
上述過程在現實發展中肯定不是這個過程,因為這是我胡亂造的(哈哈,是不是有點信以為真),但是他們的出現確實是為了解決上面說的問題
通過這篇文章我們瞭解了原碼、反碼、補碼
原碼:把最左邊的一位騰出來表示正負,0 表示正數,1 表示負數 反碼:正數的反碼與其原碼相同,負數的反碼是符號位不變其他位取反 補碼:正數的補碼與其原碼相同,負數在反碼的基礎上 +1
上面還遷移默化的說了一個問題不是到各位觀眾老爺看出來了沒
就是現代計算機運算都是先換算成補碼然後進行運算的
有說的不明白的地方歡迎各位拍磚