【補碼】html
一、補碼的表示方法是:spa
正數的補碼就是其自己htm
負數的補碼是在其原碼的基礎上, 符號位不變, 其他各位取反, 最後+1. (即在反碼的基礎上+1)blog
二、爲什麼要使用補碼.get
補碼將減法問題轉化爲了加法問題。使用同餘原理,巧妙地將符計算也藏了進去。基礎
按位取反的本質:以 Signed Byte 的前7位爲例,對x按位取反,得的值爲 127-x。例如,1,前7位按位取反,會獲得 127-1=126。變量
補碼爲按位取反,且+1。還有 Signed Byte 爲例,例如,1,前7位按位取反,會獲得 127-1=126,+1後爲127。原理
因此,Signed Byte下,-1的補碼,符號位爲1,其他7位爲FFF|FFFF。方法
那如何由補碼求得原值呢,對 FFF|FFFF按位取反,其值爲 127-FFF|FFFF=0,再加上1,就等於原值1。im
能夠發現,原值=>補碼的過程當中須要加1,補碼=>原值的過程當中也須要加1。以變量來推一下。
原值 x,補碼爲 127-x+1。
原值 127-x+1,按位取反爲 127-(127-x+1) = (127+127+x-1)%127 = x-1。比原值x少了1。
因此從補碼值域獲得原值,須要按位取反再+1。
參考:
一、https://www.cnblogs.com/zhangziqiu/archive/2011/03/30/ComputerCode.html
二、https://www.cnblogs.com/dyllove98/archive/2013/08/04/3236802.html