Java中的基本類型轉換,數據溢出原理


java中的數據類型

  java是一種強類型語言,在java中,數據類型主要有兩大類,基本數據類型和引用數據類型,不同的數據類型有不同的數據存儲方式和分配的內存大小。

  基本數據類型中,各數據類型所表示的范圍也是不一樣的,如下所示:

  由於在java中,整數默認是采用int型,浮點數默認采用的是double型進行存儲,所以在定義long型和float型數據時,必須在數值后面加'l','L'和'f','F',如:

1 long a = 1000l;
2 long b = 2000L;
3 float c = 3.14f;
4 float d = 3.14F;
 
java 中的數據類型轉換

在java中,存在兩種轉換的機制,默認類型轉換(隱式轉換)和強制類型轉換。默認類型轉換的規則如下:

  • byte,short,char  -> int ->long ->float ->double
  • 當byte,short,char相互之間不能轉換,它們參與運算首先將轉換成int類型進行運算。

強制類型轉換:

  • 目標類型  變量名 = (目標類型)(被轉換的類型)

在進行類型轉換時:

  1. 容量大的數據類型轉換為容量小的數據類型時,要加上強制轉換符,但可能造成精度降低或溢出;使用時要格外注意。
  2. 有多種類型的數據混合運算時,系統首先自動的將所有數據轉換成容量最大的那一種數據類型,然后再進行計算。
1 #案例代碼
2 byte a = 3, b = 4, c;
3 c = a + b;  
4 c = 3+4;
5 #語句 c = a + b ;因為a和b是變量,不確定具體的值,所以默認使用的int進行存儲,則運算的結果為int型,
6  賦值為byte型報錯,編譯失敗。
7 
8 #語句 c = 3 + 4;因為3和4都是常量,所以java在編譯時期會檢查運算結果是否超出byte類型的范圍,
9  沒有超過則可以賦值。

byte的存儲范圍是-128-127的整數范圍,那么如果有如下語句:

byte  a = (byte)130;

結果會是多少呢?java是如何處理強制類型轉換的溢出處理呢?

在計算機中,所有的數據都是存儲的補碼形式,那么130首先被當成int型存儲,四個字節32位,它的補碼如下:0000 0000   0000 0000   0000 0000    1000 0010,轉換為byte類型,進行截取,高字節部分去除,保留低字節部分,得到轉換為byte類型的補碼為:1000 0010,我們將其轉換為源碼:補碼(1000 0010)->反碼(1000 0001)->原碼(1111 1110)為-126,所以最后的答案是-126.如果遇到其他的類型轉換,也采用類似的處理方法。

 

快速計算強制類型轉換的截取問題

在佛羅贊的《計算機導論》(原書第二版)中介紹了大量的數據類型在計算機中的存儲方式,非常推薦這本書作為計算機專業的入門數據。書里面就講解了計算機是如何進行數據截取的,如下圖:

如此計算,是不是快速多了呢!

 

字符運算的類型轉換

我們來看如下的代碼

1 System.out.println('a');    #輸出結果a
2 System.out.println('a'+1);    #輸出結果98
3 System.out.println("hello"+'a'+1);    #輸出結果helloa1
4 System.out.println('a'+1+"hell");    #輸出結果98hello
5 System.out.println("5+5="+5+5);    輸出結果5+5=55
6 System.out.println(5+5+"=5+5");    輸出結果10=5+5

在與字符串運算時,采用從左到右的運算順序,類型轉換時,向高精度進行轉換。任何數據和字符串進行操作,結果都是字符串類型。但是要注意運算的順序。

歡迎關注我的公眾號,互聯網式街頭藝人!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM