java负数转换二进制表示_Java中的负数的在计算机中的二进制表示,以及与十进制的相互转换...
我們知道數字在計算機中都是以二進制表示的,數字類型有:byte,short,int,long 我給計算機一個數字,計算機首先要確定他的類型,因為不同類型占有的空間是不一樣的, ?? ?byte占有一個字節,總共8位,最高位是符號位,取值范圍是-128-127 ?? ?short占有兩個字節 ?? ?int占有4個字節 ?? ?long占有8個字節 計算機中的二進制都是有符號位的二進制,所以對于一個byte類型的1111 1111,他是不能表示255的,首先我們看到最高位是1,他表示的是一個負數。 這里還要說明一個問題,雖然二進制的最高位表示符號位,1對應負,0對應正,但是絕對不是像咱們想的,負數就是在正數的基礎上,把最高位改成就可以了。當然正數就是最高位是0,其他位按照咱們知道的計算即可。 那么負數到底是怎么表示的呢?為什么要這么不合我們常人的思維這樣表示呢? 你給計算機一個負的十進制數,電腦中表示的思路是:先得到它對應的正值的二進制表示,然后取反,再加一,得到對應的負數的二進制表示 這也就是計算機中的補碼表示法!!! 計算機中計算這樣一個式子:8-1,8是正數,直接用它的原碼(正數的原碼,反碼,補碼都是一樣的),-1是負數,用的它的補碼,然后8+(-1),對應位相加即可。 ?? ?這里如果按照都是byte類型來算的話:0000 1000 + 1111 1111((+1)0000 0001->(取反)1111 1110->(加一)1111 1111)= 0000 0111結果是7 上述過程,就是計算機計算加減法的實現方法。 對于如何由一個負數的二進制得到對應的十進制,是這樣的:計算機得知這是一個負數的二進制,也就是最高位是1之后,先取反再加一,得到的是正值,去相反數也就是對應的負數的十進制表示。 至于具體為什么會出現反碼和補碼,網上相關的帖子很多,大家可以看一下,首先有一個-0和+0的問題,是通過反碼補碼解決的,這里謹希望大家不要想當然的認為負數在計算機中的表示就是把對應的正數的最高位改成1,例如-1的表示是1111 1111,而不是1000 0001,這就是一個活生生的例子。 為什么會想到分析這個問題,因為在寫一個接受串口數據的程序的時候,遇到這個問題,具體如下: 接受到的數據流,Java是將其存儲到byte類型的數組中的,自然就會把最高位當成符號位,而我對于數據的組織并不是把最高位當成符號位,因此需要將符號位計算進數值中。開始的思路是直接將得到的負數取相反數,然后再加上128,也就是像上面的錯誤理解,負數是在對應的正數的基礎上把最高位變成1。 正確的做法應該是: 首先明確一下,因為你要讓最高位表示數值,而byte類型的第八位肯定要表示符號的,所以,必然要將類型轉換成空間更大的,這里轉換成int類型,因為int類型的第八位不是符號位了。要讓1-8位表示數值,而且肯定是正數,也就是除了1-8位其他的都是0,包括符號位,然而實際情況是:在將byte直接轉化成int之后,低8位不變,其他位全部是1(例如上面提到的-1的int類型表示為1111 1111 1111 1111 1111 1111 1111 1111),很簡單,因為int類型的負數的表示也是用補碼的,必然也經過取反加一的過程,所以高的24位全部變成1,要讓他們變成0,很簡單,按位與上一個0xff(0000 0000 0000 0000 0000 0000 1111 1111)即可。 具體實現是int b = b1 & 0xff;
總結
以上是生活随笔為你收集整理的java负数转换二进制表示_Java中的负数的在计算机中的二进制表示,以及与十进制的相互转换...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 敬畏生产环境
- 下一篇: 五家共井java_算法练习02:五家共井