對於有符號數:原碼就是符號位加上真值的絕對值, 即用第一位表示符號, 其他位表示值。java
例如:5blog
原碼的二進制:0000 0101源碼
例如:-5基礎
原碼的二進制:1000 0101二進制
對於無符號數:原碼就是真值。im
例如:5 源碼的二進制:0000 0101d3
在計算機中,能夠區分正負的類型,稱爲有符類型,無正負的類型(只有正值),稱爲無符類型;因此無符號數沒法表示負數數據
正數的反碼:是其自己db
例如:5img
原碼:0000 0101
反碼:0000 0101
負數的反碼:在其原碼的基礎上, 符號位不變,其他各個位取反.
例如:-5
原碼:1000 0101
反碼:1111 1010
正數的補碼:是其自己
例如:5
原碼:0000 0101
反碼:0000 0101
補碼:0000 0101
負數的補碼:在其原碼的基礎上, 符號位不變, 其他各位取反, 最後+1. (即在反碼的基礎上+1)
例如:-5
原碼:1000 0101
反碼:1111 1010
補碼:=反碼+1=1111 1010 +1 =1111 1011=251
例如:-1
原碼:1000 0001
反碼:1111 11110
補碼:1111 11111 =255
正數:補碼與原碼相等 因此無需轉換
負數補碼轉源碼:在補碼的基礎上, 符號位不變, 其他各位取反, 最後+1. (即在反碼的基礎上+1)
補碼:1111 1101
反碼:1000 0010
原碼:1000 0011=-3
計算機一般用補碼來表示有符號數,計算機的一個數據能夠看做是有符號數,也能夠看做無符號數的,也就是說計算機並不知道你存的是有符號數仍是無符號數,並且所作的運算並不須要管你存的是什麼數
一、原碼計算加減法:加法正確 ,可是減法的結果錯誤
二、反碼計算加減法:加法與減法結果都是正確的
三、使用補碼計算加減法:加法與減法結果都是正確的,而且解決了-0 的問題
使用java語言證實:因爲正數的原碼與補碼相同,因此這裏咱們使用負數證實 byte b=-3;
由結果可知JAVA代碼右位移1位的結果與咱們使用補碼計算的結果一致