簡體   English   中英

Java向下轉換

[英]Java Downcasting Conversion

為什么 char c = 65 有效而不拋出錯誤但 float d = 65.0 無效並拋出靜態錯誤:分配中的錯誤類型:從雙精度型到浮型? 兩個人不都垂頭喪氣嗎?

可以從引用一句JLS 5.2節,並說“這是這樣的,因為語言規范是這么說的”,但不會滿足不是嗎?

我對為什么設計這樣的語言的有根據的猜測:

65轉換為char ,您真正要做的只是在二進制表示中去掉一堆無關緊要的 0,因為char是 16 位,而int是 32 位。 這就像將 0065 變成 65。

另一方面, 65.0是一個double 65.0值並且以浮點格式表示。 請注意,通常,這種表示只是真實值的近似值。 有關更多信息,請參閱此帖子 位數越多,近似效果越好。 因此,從double (64 位)轉換為float (32 位)有點像將 0.333333 轉換為 0.333。 希望您同意,這比將 0065 轉換為 65 損失的信息更大。因此,這不是應該自動執行的轉換。 程序員需要意識到這種情況正在發生。


無論如何,為了完整起見,這是語言規范的相關部分:

賦值上下文允許使用以下之一:

...

此外,如果表達式是byteshortcharint類型的常量表達式(第 15.28 節):

  • 如果變量的類型是 byte、short 或 char,並且常量表達式的值可以在變量的類型中表示,則可以使用縮小原語轉換。

因此,語言規范對 byte、short、char 和 int 進行了特殊處理,允許它們在賦值上下文中進行縮小轉換。 請注意,表達式必須是:

  • 常量表達式
  • 在目標類型的范圍內,所以char x = 100000; 是無效的。
float d = 65.0;

65.0 不是浮點值。 這是一個雙重價值。 輸入浮點值時,數字必須以字母 f 結尾。

你看這里。

float d = 65.0f;

如果你想給 d 給 65 而不必寫字母 f,你可以執行以下操作。

float d = (float)65.0;

這被稱為窄鑄造。

Java 意義上的65.0是雙倍的,因為. . 如果你希望這個數字是一個浮點數,只需在它后面添加f

float d = 65.0f

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM