java-Promotion与cast

如果你寫個程式片段:
double PI = 3.14;

這沒有問題,但如果你寫個程式片段:
float PI = 3.14;

你會得到一個possible loss of precision的編譯錯誤!如果你要通過編譯,你必須這麼寫:
float PI = (float) 3.14;

這就是所謂的CAST,編譯器在編譯時,就會雞婆地換成這個:
float PI = 3.14F;

在浮點數後寫F(或f),這表示告訴編譯器,這個浮點數要使用float的資料型態(長度)。如果你只寫下浮點數而沒有寫F(或f),例如第一個程式片段,則編譯器會換成這個:
double PI = 3.1400000000000001D;

也就是不指定F(或f)時,浮點數預設會使用double的型態。

再來看整數的部份。如果你寫下:
int number = 10;

這沒有問題。如果你寫下:
int number = 2147483648;

編譯時會得到integer number too large的錯誤。你以為int變數
number裝不下2147483648,認為這樣可以解決問題:
long number = 2147483648;

其實不然,事實並非是number裝不下2147483648(如果是的話,應該是possible loss of precision才對)!而是當你在程式中寫下一個整數時,預設是使用不超過int型態的長度。 2147483648超出了int型態的長度,你要直接告訴編譯器,用long來配置整數的長度,也就是:
long number = 2147483648L;

當你在程式中寫下一個整數時,預設是使用不超過int型態的長度:
byte number = 10;

這樣OK!但這樣不行:
byte number = 128;

這樣就會出現
possible loss of precision

再來看運算,如果運算式中包括不同型態的數值,則運算時以最長的長度為主,其它數值自動提昇,也就是所謂的Promotion。例如:
int a = 10;
double b = a * 3.14;

此時因為3.14是浮點數(而且是double),所以a提昇為double,事實上,編譯器會變成這樣:
int i = 10;
double d = (double)i * 3.1400000000000001D;

再來如果運算元都是不大於int的整數,則自動全部提昇為int型態再進行運算,所以,下面這個通不過編譯:
short a = 1;
short b = 2;
short c = a + b;

第三行會出現
possible loss of precision ,你要改成這樣才對:
short a = 1;
short b = 2;
short c = (short) (a + b);

這個也通不過編譯,一樣第三行
possible loss of precision
short a = 1;
long b = 2;
int c = a + b;

因為運算元中,b為long,所以a自動提昇為long,運算後為long,裝不進int的c中!這樣才可以:
short a = 1;
long b = 2;
int c = (int)(a + b);
注意布尔型不能做任何类型转换,实际上布尔型数据只能进行赋值true与false和测试真假操作,不能进行加减等任何运算!!!
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值