2011-03-18 63 views
1

我想了解的是,在java.I內部如何擴展或縮小隱式轉換知道它涉及位擺弄。java中的原始數據類型鑄造 - 內部邏輯

例如:

//implicit 
int i =2400; 
long a = (long)i; 

//Explicit 
float d = (float) 2.23423; 

更新:

我看着張貼在這裏的問題 Bitshifting to read/write data 。彼得Lawrey給了以下的答案後,寫了這篇文章。

public long create(int one, int two){ 
    return ((long) one << 32) | (two & 0xFFFFFFFFL); 
} 

再次重申同樣,擴大轉換像上面機器級發生或多或少與由Peter上述smiliar相同的邏輯。

請讓我知道您寶貴的意見。

+1

JLS第5章介紹Java中可用的轉換類型:[http://java.sun.com/docs/books/jls/third_edition/html/conversions.html]。它的實現與平臺有關,通常發生在機器代碼級別。 – mazaneicha 2011-03-18 12:30:26

回答

3

Java使用您的CPU支持的IEEE 754標準機器代碼指令。因爲這樣的Java沒有使用你可以進一步分解的東西來實現這個功能。

用於從雙倍轉換爲浮點。

  • 符號被保留
  • 指數被截斷,但如果數量過大也趨於無窮大,如果小,就變爲零。
  • 這兩種格式都有一個隱含的最高位,這是1,這是不變的。
  • 尾數的頂部23比特被保持(與第24比特的可選舍入)

對於float加倍該過程類似於除字段被擴展。

但是,這些都是在浮點處理器單元中完成的,而Java對它的發生方式沒有任何作用。

+0

@mazaneicha:在機器代碼級別,發生了什麼@inovaovao 。 – 2011-03-18 12:35:51

+0

@Suresh S,他確實說過在代碼級發生了什麼,但他混淆了unsigned int/long值(Java沒有)與float/double發生的情況 – 2011-03-18 12:46:05

-1

double有64位,而float有32位。當你將一個double加入到一個浮點數中時,你只需要丟棄前32位。當你擴大你只需添加多個0位來填充更大的類型,例如你在一個int的32位的前面添加32個零作爲一個長整數。

+1

-1:位長64位雙。如果你刪除了64位雙精度型的第一個32位,你會得到無用的隨機數據。順便說一句:擴展的0位從int轉換爲long對於unsigned int值是正確的(Java沒有) – 2011-03-18 12:45:01

+0

@Peter你是對的:對於雙打來說它有點複雜。你知道細節嗎? – inovaovao 2011-03-18 12:47:54

+0

看我的編輯。它更復雜。 ;) – 2011-03-18 12:48:35