請先看以下博文
原碼, 反碼, 補碼 詳解
c語言系列(二)有符號數和無符號數詳解
有符號數,無符號數
對於乙個二進位制數,它可以是有符號數,也可以是無符號數,具體是哪個,由**決定。比如
1000 0001
無符號數:當前二進位制的大小,即1000 0001
表示129
有符號數:將最左邊一位做為符號位,剩下的才是值。如果第一位是 1,則是負數。如果第一位是0,則是正數。
原碼,反碼,補碼
以有符號數6的8位二進位制來做例子。
0000 0110
原碼
:第一位表示符號, 其餘位表示值。如
[+6]原 =0000 0110
[-6]原 = 1000 0110
反碼
:正數的反碼是其本身,負數的反碼是符號位不變,將其餘位取反。如
[+6]原 = 0000
0110 -> [+6]反 = 0000
0110
[-6]原 = 1000
0110 -> [-6]反 = 1111
1001
補碼
:正數的補碼是其本身,負數的補碼是將原碼轉成反碼後加1。如
[+6]原 = 0000
0110 -> [+6]補 = 0000
0110
[-6]原 = 1111
1001 -> [-6]反 = 1111
1001 -> [-6]補 = 1111
1010
練習練習
1.試著用補碼來計算下-2 + 4
4用補碼表示
0000 0100
-2的補碼如下
[+2]原 = 0000
0010 -> [+2]反 = 1111
1101 -> [-2]補 = 1111
1110
相加運算
0000 0100
1111 1110
得到
1 0000 0010
即
0000 0010
值為2
2.某個補碼為10011101
,它對應的數值是多少?
要得到我們理解的十進位制數值,按照正值轉補碼的方法,逆轉一下就可以了,即:
符號位不變,將補碼先減1,得到反碼,再反轉,得到原碼,將原碼轉為十進位制
[?]補10011101
-> 減1
[?]反10011100
-> 反轉
[?]原11100011
得到的值為
1100011
即-99
可以在這裡驗證
原碼 反碼 補碼 有符號數和無符號數運算
原碼 原碼就是符號位加上真值的絕對值,即用第一位表示符號,其餘位表示值.比如如果是8位二進位制 1 原 0000 0001 1 原 1000 0001 第一位是符號位.因為第一位是符號位,所以8位二進位制數的取值範圍就是 1111 1111 0111 1111 即 127 127 原碼是人腦最容易理...
無符號數 有符號數 與 補碼
本文是深入理解計算機系統這本書裡面關於補碼有符號數無符號數章節的乙個摘要和讀書報告,我個人認為這本書關於這一段的表述,要比絕大多數網上的部落格甚至是國內教材要深入淺出的多.同時由於markdown的文件表示公式很麻煩,本文將大量使用書中的截圖作為公式使用.書中採用乙個函式b2u w binary t...
有符號數的原碼 反碼 補碼詳解
有符號數 signed d 符號位 數值位 例如 int i 7 int 型別佔4個位元組,1個位元組佔8個位,int佔32個位元位 7 根據8421碼得到二進位制原碼 0b00000000000000000000000000000111 int 型別的表數範圍 計算機中儲存有符號數的時候是按照補碼...