java负数转换二进制表示_Java中的负数的在计算机中的二进制表示,以及与十进制的相互转换...
我們知道數(shù)字在計(jì)算機(jī)中都是以二進(jìn)制表示的,數(shù)字類型有:byte,short,int,long 我給計(jì)算機(jī)一個(gè)數(shù)字,計(jì)算機(jī)首先要確定他的類型,因?yàn)椴煌愋驼加械目臻g是不一樣的, ?? ?byte占有一個(gè)字節(jié),總共8位,最高位是符號(hào)位,取值范圍是-128-127 ?? ?short占有兩個(gè)字節(jié) ?? ?int占有4個(gè)字節(jié) ?? ?long占有8個(gè)字節(jié) 計(jì)算機(jī)中的二進(jìn)制都是有符號(hào)位的二進(jìn)制,所以對(duì)于一個(gè)byte類型的1111 1111,他是不能表示255的,首先我們看到最高位是1,他表示的是一個(gè)負(fù)數(shù)。 這里還要說(shuō)明一個(gè)問(wèn)題,雖然二進(jìn)制的最高位表示符號(hào)位,1對(duì)應(yīng)負(fù),0對(duì)應(yīng)正,但是絕對(duì)不是像咱們想的,負(fù)數(shù)就是在正數(shù)的基礎(chǔ)上,把最高位改成就可以了。當(dāng)然正數(shù)就是最高位是0,其他位按照咱們知道的計(jì)算即可。 那么負(fù)數(shù)到底是怎么表示的呢?為什么要這么不合我們常人的思維這樣表示呢? 你給計(jì)算機(jī)一個(gè)負(fù)的十進(jìn)制數(shù),電腦中表示的思路是:先得到它對(duì)應(yīng)的正值的二進(jìn)制表示,然后取反,再加一,得到對(duì)應(yīng)的負(fù)數(shù)的二進(jìn)制表示 這也就是計(jì)算機(jī)中的補(bǔ)碼表示法!!! 計(jì)算機(jī)中計(jì)算這樣一個(gè)式子:8-1,8是正數(shù),直接用它的原碼(正數(shù)的原碼,反碼,補(bǔ)碼都是一樣的),-1是負(fù)數(shù),用的它的補(bǔ)碼,然后8+(-1),對(duì)應(yīng)位相加即可。 ?? ?這里如果按照都是byte類型來(lái)算的話:0000 1000 + 1111 1111((+1)0000 0001->(取反)1111 1110->(加一)1111 1111)= 0000 0111結(jié)果是7 上述過(guò)程,就是計(jì)算機(jī)計(jì)算加減法的實(shí)現(xiàn)方法。 對(duì)于如何由一個(gè)負(fù)數(shù)的二進(jìn)制得到對(duì)應(yīng)的十進(jìn)制,是這樣的:計(jì)算機(jī)得知這是一個(gè)負(fù)數(shù)的二進(jìn)制,也就是最高位是1之后,先取反再加一,得到的是正值,去相反數(shù)也就是對(duì)應(yīng)的負(fù)數(shù)的十進(jìn)制表示。 至于具體為什么會(huì)出現(xiàn)反碼和補(bǔ)碼,網(wǎng)上相關(guān)的帖子很多,大家可以看一下,首先有一個(gè)-0和+0的問(wèn)題,是通過(guò)反碼補(bǔ)碼解決的,這里謹(jǐn)希望大家不要想當(dāng)然的認(rèn)為負(fù)數(shù)在計(jì)算機(jī)中的表示就是把對(duì)應(yīng)的正數(shù)的最高位改成1,例如-1的表示是1111 1111,而不是1000 0001,這就是一個(gè)活生生的例子。 為什么會(huì)想到分析這個(gè)問(wèn)題,因?yàn)樵趯懸粋€(gè)接受串口數(shù)據(jù)的程序的時(shí)候,遇到這個(gè)問(wèn)題,具體如下: 接受到的數(shù)據(jù)流,Java是將其存儲(chǔ)到byte類型的數(shù)組中的,自然就會(huì)把最高位當(dāng)成符號(hào)位,而我對(duì)于數(shù)據(jù)的組織并不是把最高位當(dāng)成符號(hào)位,因此需要將符號(hào)位計(jì)算進(jìn)數(shù)值中。開(kāi)始的思路是直接將得到的負(fù)數(shù)取相反數(shù),然后再加上128,也就是像上面的錯(cuò)誤理解,負(fù)數(shù)是在對(duì)應(yīng)的正數(shù)的基礎(chǔ)上把最高位變成1。 正確的做法應(yīng)該是: 首先明確一下,因?yàn)槟阋屪罡呶槐硎緮?shù)值,而byte類型的第八位肯定要表示符號(hào)的,所以,必然要將類型轉(zhuǎn)換成空間更大的,這里轉(zhuǎn)換成int類型,因?yàn)閕nt類型的第八位不是符號(hào)位了。要讓1-8位表示數(shù)值,而且肯定是正數(shù),也就是除了1-8位其他的都是0,包括符號(hào)位,然而實(shí)際情況是:在將byte直接轉(zhuǎn)化成int之后,低8位不變,其他位全部是1(例如上面提到的-1的int類型表示為1111 1111 1111 1111 1111 1111 1111 1111),很簡(jiǎn)單,因?yàn)閕nt類型的負(fù)數(shù)的表示也是用補(bǔ)碼的,必然也經(jīng)過(guò)取反加一的過(guò)程,所以高的24位全部變成1,要讓他們變成0,很簡(jiǎn)單,按位與上一個(gè)0xff(0000 0000 0000 0000 0000 0000 1111 1111)即可。 具體實(shí)現(xiàn)是int b = b1 & 0xff;
總結(jié)
以上是生活随笔為你收集整理的java负数转换二进制表示_Java中的负数的在计算机中的二进制表示,以及与十进制的相互转换...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 敬畏生产环境
- 下一篇: java 多线程缓存_[Java教程]【