java 整数变负数_一文帮你读懂Java整数的存储原理
前言
大家應該都知道,整數包括負數,零,和正數。在Java中,基本類型中byte(8位)、short(16位)、int(32位)、long(64位)屬于整數,并且沒有無符號數,均是有符號的。對于計算機來說,它只認識二進制,也就是0和1,那我們開發過程中所使用的整數(大多是10進制)在計算機中是怎么存儲成二進制的呢?本文將詳細解讀Java整數在計算機中的存儲原理。
整數的編碼方式
整數的編碼分為原碼、反碼和補碼。計算機使用的是補碼的存儲方式。它們的定義如下:
原碼:在數值前面增加了一位符號位(即最高位為符號位),該位為0表示正數,該位為1表示負數,其余位表示數值的大小。
反碼:正數的反碼與其原碼相同。負數的反碼是對其原碼逐位取反,但符號位除外。
補碼:正數的補碼與其原碼相同,負數的補碼就是對該負數的反碼加1。
因為計算機是以補碼來存儲整數的,所以補碼就顯得很重要。那么如何計算整數的補碼呢?下面以具體例子來說明。
100 -> 原碼/反碼/補碼:01100100
0 -> 原碼/反碼/補碼:00000000
-100 -> 原碼:11100100 -> 絕對值:01100100 -> 取反加1:10011011+1 -> 補碼:10011100
1 -> 原原碼/反碼/補碼:00000001
-1 -> 原碼:10000001 -> 絕對值:00000001 -> 取反加1:11111110+1 -> 補碼:11111111
127 -> 原碼/反碼/補碼:01111111
-128 -> 絕對值:10000000 -> 取反加1:01111111+1 -> 補碼:10000000
從定義可以看出,正數的補碼,反碼,原碼相同。0的補碼就是本身。
那么負數的原碼和補碼如何轉換呢?
- 已知一個負數求補碼方法:絕對值原碼按位求反加1。
- 已知負數補碼求負數方法:符號位不變,其他位按位求反加1。
有了原碼,為什么還要用補碼來存儲整數
下面我們以基本類型byte為例來說明這個問題,
因為byte是8bit,從理論上講,如果利用充分的話,那么它應該可以表示2^8=256個數值。
如果采用原碼來存儲
1 - 1 = 1 + ( -1 ) =(00000001) + (10000001) = (10000010) = -2 這顯然是不正確的。
原碼在兩個整數的加法運算中是沒有問題的,問題出現在帶符號位的負數身上。原碼無法滿足運算要求。
如果采用反碼來存儲
反碼的取值空間和原碼相同且一一對應。所以反碼的表示范圍位:-127到-0到+0到+127,共255個數值,這里我們把+0和-0都當成0對待。
下面是反碼的減法運算:
1 - 1 = 1 + ( -1 )= (00000001) + (11111110) = (11111111) = ( -0 ) 沒問題。1 – 2 = 1 + ( -2 ) = (00000001) + (11111101) = (11111110) = ( -1 ) 正確。反碼的問題出現在(+0 : 00000000)和(-0 : 11111111)上,因為在人們的計算概念中零是沒有正負之分的。
如果采用補碼來存儲
1 - 1 = 1 + (-1) = (00000001) + (11111111) = (00000000) = 0 正確。 1 – 2 = 1 + (-2) = (00000001) + (11111110) = (11111111) = ( -1 ) 正確。00000000 表示0,10000000(0的反碼:01111111加上1) 表示 -128
通過補碼的運算,可以看出補碼的設計目的是:
- 使符號位能與有效值部分一起參加運算,從而簡化運算規則。
- 使減法運算轉換為加法運算,進一步簡化計算機中運算器的線路設計。
- 此外,在補碼中用-128(10000000)代替了-0,所以沒有+0和-0之分,符合常理,所以補碼的表示范圍為: -128到127共256個。
- 補碼剛好是充分利用了byte的8bit空間。
結語
本文詳細解讀了Java整數(包括正數和負數)在計算機中的存儲原理,并且以byte基本數據類型為例闡述了采用補碼的形式存儲數值的好處,希望大家看完本篇后能夠弄清楚整數在計算機中的存儲原理。
總結
以上是生活随笔為你收集整理的java 整数变负数_一文帮你读懂Java整数的存储原理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: gin ajax 获取请求参数,gin请
- 下一篇: linux mysql 静态库_Linu