2015-07-09 26 views
3

請注意我不在尋找代碼來將double或int縮小爲int。管理縮小雙向int的規則

作爲每JLS - $ 5.1.3 Narrowing Primitive Conversion

帶符號的整數的一種積分類型T ,縮小轉換簡單地丟棄所有,但n個最低階位,其中n是用於表示類型T.比特數

所以,當我盡力縮小一個260(二進制表示爲100000100),以一個字節然後結果是4,因爲最低8位是00000100這是一個十進制4或長值4294967296L(二進制表示100000000000000000000000000000000)將字節則結果爲0。

現在,爲什麼我想知道縮小雙重規則爲int的規則,字節等是當我縮小一個double4294967296.0那麼結果是2147483647但是當我縮小長4294967296L值然後結果是0

我已經理解了對int,byte等的長期縮小(拋棄了所有的n個最低位),但是我想知道在雙縮小的情況下會在什麼情況下進行。

+5

答案是在你引用的那行之後有幾行:_將浮點數轉換爲整型T需要兩步:[...] _ –

+0

我確實讀過它,但我真的無法從中得到答案。我可以理解,它會從1.b完成,但無法理解。如果你可以請投擲燈光,我會非常感激。 – hagrawal

+0

我認爲它會在某種程度上理解雙重浮動縮小規則,受IEEE 754四捨五入。 – hagrawal

回答

1

我已經理解了長整數,字節等(丟棄所有n位最低位),但我想知道什麼是去的在雙重縮小的情況下在引擎蓋下。

...我想了解爲什麼和如何部分。

  1. 的JLS(JLS 5.1.3)指定的結果是什麼。的簡化版本(int)是:

    • 爲NaN變爲零
    • 一個INF變爲 「MAX-INT」 或 「分鐘-INT」
    • 否則:
      • 輪向零到得到某個整數
      • 如果圓形數字是太大的int,結果變成「分鐘-INT」或「MAX-INT」
  2. 「如何」是特定於實現的。有關如何實現可能是的示例,請查看Hotspot源代碼(OpenJDK版本)或讓JIT編譯器轉儲一些本機代碼供您查看。 (我想,本地代碼映射使用單個指令來做實際的轉換......但我沒有檢查)

  3. 「爲什麼」是不可知的......除非你可以問一個原始的Java設計師/規範作者。一種可能的解釋是以下的組合:

    • 很容易理解
    • 它與C/C++一致,
    • 可以在共同的硬件平臺有效地實現,並且
    • 最好是而不是設計者考慮的(假設)替代方案。

    (例如,投擲爲NaN的異常,天道酬勤,外的範圍將是與其他原語轉換不一致,並且可能是實現起來比較昂貴。)

+0

感謝您的意見。哦好吧。我現在明白了。我想我因爲寫在JLS中而感到困惑(或者可能存在混淆)。如果我的理解錯誤,請糾正我 - 按照算法的步驟,#1的第3項「否則,以下兩種情況之一必須爲真:」將在浮點數爲無窮時執行(這意味着FALSE爲如果結果不能表示爲long或int,則在#2中進行四捨五入後進行第二個項目符號#)。 – hagrawal

+0

如果你能讓我知道你的輸入,那麼我們可以關閉它。請讓我知道,如果上面的評論不清楚給你。 – hagrawal

+0

我已經關閉它。但一旦你沒有時間,請讓我知道你的投入。 – hagrawal

1

將double轉換爲整數時,結果爲Integer.MAX_VALUE,並且該值超出整數的範圍。 Integer.MAX_VALUE是2^31 - 1.

+0

如何以及爲什麼是這個問題。 – hagrawal

+0

規範沒有說明爲什麼,它只是說這是結果。 – stark

+0

是的,我同意,但我想了解爲什麼和如何部分。 – hagrawal

1

當您以double值4294967296.0開頭時,它大於最大的long值,即2147483647,因此應用以下規則(從您引用的頁面開始):The值必須太大(大數值的正值或正數的無窮大),並且第一步的結果是int或long的最大可表示值,並且您得到0x7FFFFFF = 2147483647

但是當您嘗試轉換4294967296L = 0x100000000,你從一個整型開始,所以規則是:將有符號整數縮小到整數類型T只是簡單地丟棄除n個最低位之外的所有位所以如果n是小於32(8字節),你剛剛得到一個0.

+0

謝謝您的輸入。如果按照上面提到的算法進行操作,那麼這是真實的「如果浮點數不是無窮大,則浮點值將四捨五入爲整數值V,並使用IEEE 754輪到零模式向零舍入」因爲我的電話號碼是4294967296.0,這不是無用的。這意味着現在使用IEEE 754 round-to-zero模式將會趨於零。沒有? – hagrawal

+0

Long.MAX_VALUE = 9223372036854775807 – stark