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中,存在兩種轉換的機制,默認類型轉換(隱式轉換)和強制類型轉換。默認類型轉換的規則如下:
- byte,short,char -> int ->long ->float ->double
- 當byte,short,char相互之間不能轉換,它們參與運算首先將轉換成int類型進行運算。
強制類型轉換:
- 目標類型 變量名 = (目標類型)(被轉換的類型)
在進行類型轉換時:
- 容量大的數據類型轉換為容量小的數據類型時,要加上強制轉換符,但可能造成精度降低或溢出;使用時要格外注意。
- 有多種類型的數據混合運算時,系統首先自動的將所有數據轉換成容量最大的那一種數據類型,然后再進行計算。
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
在與字符串運算時,采用從左到右的運算順序,類型轉換時,向高精度進行轉換。任何數據和字符串進行操作,結果都是字符串類型。但是要注意運算的順序。
歡迎關注我的公眾號,互聯網式街頭藝人!