這是基礎(chǔ)的概念問題,但有些東西令我很氣憤楚殿,比如有人說反碼就是逐位取反撮慨,這種誤人子弟的話,確實(shí)令我很氣憤脆粥。我結(jié)合自己的學(xué)習(xí)概括如下砌溺,希望對有需要的朋友有所幫助。
首先我們的數(shù)分為有符號(hào)數(shù)和無符號(hào)數(shù)兩類变隔,有符號(hào)數(shù)分為正數(shù)和負(fù)數(shù)兩類规伐,無符號(hào)數(shù)全是正數(shù),有符號(hào)數(shù)的最高位為符號(hào)位弟胀,0為正楷力,1為負(fù)喊式,除掉最高位的符號(hào)位以外的數(shù)字代表著我們所謂的值域,而無符號(hào)數(shù)所有數(shù)字全是值域萧朝。
針對正數(shù)岔留,采用除二取余,逆序排列求得原碼检柬,正數(shù)的反碼献联,補(bǔ)碼與原碼相同;
針對負(fù)數(shù)何址,其`補(bǔ)碼`等于對其絕對值先二進(jìn)制表示里逆,再逐位取反,最后低位加1而成(加1的時(shí)候有進(jìn)位的就進(jìn)位)用爪,補(bǔ)碼的補(bǔ)碼就是原碼原押,求反碼為原碼符號(hào)位不變,其余位逐位取反偎血,補(bǔ)碼為反碼低位加1诸衔。
正負(fù)數(shù)求反碼方式都不一樣,又怎么會(huì)來反碼就是逐位取反這種滑稽之談呢颇玷?甚至還有人說負(fù)數(shù)的二進(jìn)制表示是補(bǔ)碼+1笨农,這種說法更是莫名其妙,誰的補(bǔ)碼帖渠?哪里來的+1谒亦?
規(guī)則說到這里就完了,如果你想知道Java里面怎么處理的空郊,你可以往下看份招。
結(jié)合Java語言,做個(gè)實(shí)際說明渣淳,我聲明 int a = 20, 在Java中脾还,int類型占4個(gè)byte,即32bit入愧,即用32位二進(jìn)制表示鄙漏,則20的原碼為00000000000000000000000000010100,其中最左邊的那個(gè)0為符號(hào)位棺蛛,剩余的26個(gè)0加上10100為值域怔蚌,合起來意思就是正的20,那么-20的原碼是多少呢旁赊,按照負(fù)數(shù)求原碼的規(guī)則桦踊,該是11111111111111111111111111101100,最高位為1终畅,代表為負(fù)數(shù)籍胯。但是給你這么個(gè)二進(jìn)制數(shù)11111111111111111111111111101100竟闪,怎么知道它的十進(jìn)制表示多少呢?首先杖狼,這是java的int型炼蛤,屬于有符號(hào)數(shù)(你需要知道,java里面的數(shù)字類型全是有符號(hào)數(shù))蝶涩,讀取最高位符號(hào)位1理朋,代表負(fù)數(shù),按照求負(fù)數(shù)原碼的方式逆著操作就可以找出這個(gè)負(fù)數(shù)對應(yīng)的絕對值了绿聘,先減1嗽上,得11111111111111111111111111101011然后逐位取反,得到00000000000000000000000000010100熄攘,這是個(gè)正數(shù)兽愤,代表這20,所以加起來這是負(fù)數(shù)的20鲜屏,即-20烹看。