關於Java基本資料型別那些小細節(變數宣告、型別轉換、賦值等)
走過路過不要錯過,快來看一看,瞧一瞧了,買不了吃虧買不了上當,滿滿乾貨。hhhhh~
前提:瞭解基本型別https://www.runoob.com/java/java-basic-datatypes.html
一、變數宣告
- 整數型預設int
- 浮點型預設double
1、宣告float型別
float f11 = 1; //賦值整數不會報錯,可加f可不加,會自動轉換成帶精度的數 // float f12 = 1.0; //賦值小數會報錯,要加上f字尾 float f13 = 1.0f;
注意:當進行兩個數(整數/浮點數)進行比較,float型別的變數值帶f字尾時,有兩種情況。(這個細節很容易忽視,就好比字串比較時,經常會習慣性用==操作符)
(一)被比較的數為帶精度的整數,例:1.0等。
此時,被比較數不需要加f字尾,也能正確得到比較結果。如下圖所示:
(二)被比較的數為純小數,例:1.8等。
此時,被比較數需要加f字尾,才能正確得到比較結果。如下圖所示:
被比較數不加f字尾時:
被比較數加f字尾時:
2、宣告double型別
// 宣告double型別時,可加d字尾可不加,會自動轉換為帶精度的數 double d11 = 1; double d12 = 1.0; double d13 = 1.0d;
注意:當進行兩個數(整數/浮點數)進行比較時,與純小數比較時,也有兩種情況。(這個情況主要還是和精度有關,一般不容易犯錯,但也要注意)
(一)被比較的數為不帶字尾的純小數,例:1.8等
因為浮點數預設double,不帶字尾的純小數都預設轉換為double了,所以能得到正確的比較結果。如下圖所示:
(二)被比較的數為帶字尾f的純小數,例:1.8f等
因為double比float精度高,所以不能得到正確的比較結果。如下圖所示:
3、宣告long型別
// 宣告long型別 // long l11 = 444444444444444;//報錯,要加上l字尾 long l12 = 444444444444444l;
4、區域性變數宣告時沒有初始化就使用,會報錯(有點跳戲了,不過和變數宣告還是有一絲絲關係啦~~~)
int a; int b = 0; int c = 0, d = 0; // System.out.println(a); //未初始化就使用會報錯(區域性變數) System.out.println(b); //初始化使用不會報錯(區域性變數)
二、型別轉換與賦值
- 向上自動轉換
- 向下強制轉換
備註: byte的型別的範圍是 -128 ~ 127 ( -2^(8-1) ~ 2^(8-1) -1 )
1、賦值問題
舉例:byte賦值
//直接賦值超出範圍報錯,如下 // byte exampleB1 = 128;
2、強制轉換資料溢位情況
舉例: int轉byte
int exampleB2 = 129; //129往前移兩位得-127 System.out.println((byte)exampleB2); //-127 int exampleB3 = -129; //-129往前移一位得127 System.out.println((byte)exampleB3); //127 int exampleB4 = 256; //256往前移(256-127=129)位,即0 System.out.println((byte)exampleB4); //0
分析:
想象這個範圍是在數軸上一直連續的區間
以中間這個區間為起始區間,當int = 129時,超出了區間(129-127 = 2)位,在對應的連續區間裡的位置是第二位,第一位是-128,第二位是-127,所以此時強制轉換列印的值是-127,而不是129
以中間這個區間為起始區間,當int = -129時,超出了區間(-128 - (-129) = 1)位,在對應的連續區間裡的位置是第一位,數一位,第一位是127,所以此時強制轉換列印的值是127,而不是129
記得點贊,麼麼噠~~~(づ ̄ 3 ̄)づ,愛您!