Java中的基本數據類型int及數據溢出

1. 概述
Java語言內置了八種基本數據類型:六種數字類型(四個整數型查排,兩個浮點型)闹伪,一種字符類型吁讨,還有一種布爾型疚顷。

其中int 數據類型是++32位++旱易、++有符號++的以++二進制補碼++表示的整數

最小值是 -2,147,483,648(-2^31);
最大值是 2,147,483,647(2^31 - 1)腿堤;
一般的整型變量默認為 int 類型咒唆;
int的默認值是 0

public class Test {  
    public static void main(String[] args) {
        System.out.println("二進制長度:" + Integer.SIZE); 
        System.out.println("最小值Integer.MIN_VALUE = " + Integer.MIN_VALUE); 
        System.out.println("最大值Integer.MAX_VALUE = " + Integer.MAX_VALUE);  
    }//歡迎加入Java開發(fā)交流君樣:909038429
}

輸出結果:

二進制長度:32
最小值Integer.MIN_VALUE = -2147483648
最大值Integer.MAX_VALUE = 2147483647

2. 補碼
Java里的int是有符號的,二進制系統(tǒng)是通過補碼來保存數據的释液,最高位為1的數字用來表示負數,而最高位為0的數字表示非負數装处。

正數補碼等于原碼误债,負數的補碼等于其絕對值的反碼+1。例如:-1的補碼就是絕對值1的反碼(按位取反) 再+1妄迁。計算方式如下:

  0000 0000 0000 0000 0000 0000 0000 0001      => 1的二進制
  1111 1111 1111 1111 1111 1111 1111 1110      => 1的反碼
+ 0000 0000 0000 0000 0000 0000 0000 0001
-----------------------------------------
  1111 1111 1111 1111 1111 1111 1111 1111      => -1的補碼

常見整數對應的補碼:

1000 0000 0000 0000 0000 0000 0000 0000 => -2147483648
1111 1111 1111 1111 1111 1111 1111 1111 => -1
0000 0000 0000 0000 0000 0000 0000 0000 => 0
0000 0000 0000 0000 0000 0000 0000 0001 => 1
0111 1111 1111 1111 1111 1111 1111 1111 => 2147483647

例:獲取整數二進制

public class Test {
    public static void main(String[] args) {
        int[] arrayInt = new int[] {Integer.MAX_VALUE, 0, 1, -1, Integer.MIN_VALUE};
        for (int x : arrayInt) {
            String binaryString = Integer.toBinaryString(x);
            int length = Integer.SIZE;
            while(binaryString.length() < length){
                // 在不足的位數前加“0”
                binaryString = "0" + binaryString;
            }
            // 為了方便查看寝蹈,每4位插入分割符
            int m = binaryString.length()/4 - 1;
            StringBuffer stringBuffer = new StringBuffer(binaryString);
            for (int i = m; i > 0; i--) {
                int j = 4 * i;
                stringBuffer.insert(j,' ');
            }
            System.out.printf("%,14d", x);
            System.out.print(" 對應的二進制為:");
            System.out.printf("%s%n", stringBuffer.toString());

        }//歡迎加入Java開發(fā)交流君樣:909038429
    }
}

輸出結果:

 2,147,483,647 對應的二進制為:0111 1111 1111 1111 1111 1111 1111 1111
             0 對應的二進制為:0000 0000 0000 0000 0000 0000 0000 0000
             1 對應的二進制為:0000 0000 0000 0000 0000 0000 0000 0001
            -1 對應的二進制為:1111 1111 1111 1111 1111 1111 1111 1111
-2,147,483,648 對應的二進制為:1000 0000 0000 0000 0000 0000 0000 0000

3. 數據溢出
首先,基本的數據類型(long登淘,int箫老,short,byte黔州,char耍鬓,float阔籽,double)都有自己能夠保存的數據范圍。

數據溢出:

當某一種類型的數值已經達到了此類型能夠保存的最大值之后牲蜀,再繼續(xù)擴大笆制,或者達到了最小值后再繼續(xù)縮小,就會出現數據溢出問題涣达。而溢出不會出錯在辆,卻會得到一個意外的結果:

public class MyDemo{
    public static void main(String args []){
        int a = Integer.MAX_VALUE;//定義一個int型變量a的值為int型能夠保存的最高值
        System.out.println(a + 1);
        int b = Integer.MIN_VALUE;//定義一個int型變量a的值為int型能夠保存的最小值
        System.out.println(b - 1);
    }
}

輸出結果:

-2147483648
2147483647

下面解釋出現這種情況的原因:

  0111 1111 1111 1111 1111 1111 1111 1111      => 2147483647的補碼
+ 0000 0000 0000 0000 0000 0000 0000 0001
-----------------------------------------
  1000 0000 0000 0000 0000 0000 0000 0000      => -2147483648的補碼

最輕微的上溢是 INT_MAX + 1 :結果是 INT_MIN。
最嚴重的上溢是 INT_MAX + INT_MAX :結果是 -2度苔。
最輕微的下溢是 INT_MIN - 1 :結果是 INT_MAX匆篓。
最嚴重的下溢是 INT_MIN + INT_MIN :結果是 0。
最大值加1時寇窑,反而變成范圍的最小值鸦概,加2變成范圍的次小值,這種情況可以想象出一個循環(huán)疗认。

數據溢出的解決辦法:

我們已經知道完残,在整型中,能夠保存的數值范圍最大的是long型横漏;在浮點型中谨设,能夠保存的數值范圍最大的是double型。所以在遇到數據溢出問題時缎浇,我們可以先把能夠保存的數值范圍小的類型轉換為范圍大的類型扎拣,再進行運算素跺。

例:

public class Test{
    public static void main(String args []){
        //定義一個int型的最大值
        int x = Integer.MAX_VALUE;
        System.out.println((long)x+2);
    }
}

輸出結果是:2147483649

image

最新2020整理收集的一些高頻面試題(都整理成文檔)二蓝,有很多干貨,包含mysql指厌,netty鸥诽,spring,線程,spring cloud、jvm帝火、源碼犀填、算法等詳細講解疏日,也有詳細的學習規(guī)劃圖睬辐,面試題整理等隘谣,需要獲取這些內容的朋友請加Q君樣:909038429
/./*歡迎加入java交流Q君樣:909038429一起吹水聊天

?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末忘衍,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子多望,更是在濱河造成了極大的恐慌,老刑警劉巖颅痊,帶你破解...
    沈念sama閱讀 218,204評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異随静,居然都是意外死亡八千,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 93,091評論 3 395
  • 文/潘曉璐 我一進店門燎猛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來恋捆,“玉大人,你說我怎么就攤上這事重绷》型#” “怎么了?”我有些...
    開封第一講書人閱讀 164,548評論 0 354
  • 文/不壞的土叔 我叫張陵昭卓,是天一觀的道長愤钾。 經常有香客問我,道長候醒,這世上最難降的妖魔是什么能颁? 我笑而不...
    開封第一講書人閱讀 58,657評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮倒淫,結果婚禮上伙菊,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好镜硕,可當我...
    茶點故事閱讀 67,689評論 6 392
  • 文/花漫 我一把揭開白布运翼。 她就那樣靜靜地躺著,像睡著了一般兴枯。 火紅的嫁衣襯著肌膚如雪血淌。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,554評論 1 305
  • 那天财剖,我揣著相機與錄音悠夯,去河邊找鬼。 笑死峰伙,一個胖子當著我的面吹牛疗疟,可吹牛的內容都是我干的。 我是一名探鬼主播瞳氓,決...
    沈念sama閱讀 40,302評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼策彤,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了匣摘?” 一聲冷哼從身側響起店诗,我...
    開封第一講書人閱讀 39,216評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎音榜,沒想到半個月后庞瘸,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 45,661評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡赠叼,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,851評論 3 336
  • 正文 我和宋清朗相戀三年擦囊,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片嘴办。...
    茶點故事閱讀 39,977評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡瞬场,死狀恐怖,靈堂內的尸體忽然破棺而出涧郊,到底是詐尸還是另有隱情贯被,我是刑警寧澤,帶...
    沈念sama閱讀 35,697評論 5 347
  • 正文 年R本政府宣布妆艘,位于F島的核電站彤灶,受9級特大地震影響,放射性物質發(fā)生泄漏批旺。R本人自食惡果不足惜幌陕,卻給世界環(huán)境...
    茶點故事閱讀 41,306評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望汽煮。 院中可真熱鬧搏熄,春花似錦茅诱、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽翎卓。三九已至契邀,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間失暴,已是汗流浹背坯门。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留逗扒,地道東北人古戴。 一個月前我還...
    沈念sama閱讀 48,138評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像矩肩,于是被迫代替她去往敵國和親现恼。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,927評論 2 355

推薦閱讀更多精彩內容

  • 目錄:1.基本數據類型2.引用數據類型 數據類型: Java語言是一個強類型語言 1.所有變量黍檩,必須先聲明類型...
    Ansaxnsy閱讀 991評論 0 7
  • 變量作用就是申請內存來存儲值叉袍,也就是說,創(chuàng)建變量的時候刽酱,需要在內存中申請空間喳逛。內存管理系統(tǒng)就是根據變量的類型為變量...
    南風_001閱讀 250評論 0 0
  • 變量申請內存來存儲值。當創(chuàng)建變量的時候棵里,需要在內存申請空間润文。內存管理系統(tǒng)根據變量的類型為變量分配存儲空間,分配的空...
    持之以蘅閱讀 298評論 0 1
  • Java語言提供了八種基本類型殿怜。六種數字類型(四個整數型(默認是int 型)典蝌,兩個浮點型(默認是double 型)...
    轝巐閱讀 1,575評論 0 1
  • 變量就是申請內存來存儲值.也就是說,當創(chuàng)建變量的時候,需要在內存中申請空間.內存管理系統(tǒng)根據變量的類型為變量分配存...
    海人為記閱讀 434評論 0 0