2016-07-02 24 views
1

最近,雖然我正在通過java中的類型轉換概念,但我已經看到將較大變量類型轉換爲較小變量結果由較小變量範圍的較大變量的模。可以請任何人詳細解釋爲什麼這是這種情況,並且對於任何顯式類型轉換它是真的嗎?爲什麼類型將較大變量投射到較小變量會導致較大變量的模以較小變量的範圍

 class conversion { 
    public static void main(String args[]) 
    { 
     double a = 295.04; 
     int b = 300; 
     byte c = (byte) a; 
     byte d = (byte) b; 
     System.out.println(c + " " + d); 
    } 
} 

上面的代碼給出d爲44,因爲300的模256的答案是44,請解釋一下爲什麼是這樣的情況,也發生了什麼c的值?

+0

你有沒有想過如果b = 128,那麼modulo的作品,但爲什麼負???檢查 –

+0

評論2:並且,如果b = 255,那麼modulo不起作用,請檢查。 –

+0

是的,我想我知道答案。由於字節數據類型範圍是0到127,如果我們越過127,溢出發生,所以它從-128到-1計數。這就是爲什麼我們不會得到正確的答案b =如果我錯了,請糾正我的錯誤? –

回答

1

這是一個設計決定,一路追溯到C語言的可編程語言,也是C語言的先行者。

當你從一個較大的整數類型轉換爲一個較小的整數類型時,會發生什麼,頂部的位被刪除。

爲什麼?最初(當前),因爲這是硬件整數指令支持。

執行此操作的「其他」邏輯方法(即不是Java定義整數縮小的方式)將轉換爲可在較小類型中表示的最大(或最小)值;例如

// equivalent to real thin in real java 
    // b = (byte) (Math.max(Math.min(i, 127), -128)) 

將給出+127作爲值b。順便說一下,這是將浮點值轉換爲整數值時發生的情況,並且該值太大。這就是您的c示例中發生的情況。


還表示:

上面的代碼給出d的答案爲44自300模256是44.

事實上,正確的計算將是:

int d = ((b + 128) % 256) - 128; 

這是因爲Java byte類型的範圍是-1 28至+127。

+0

但你的例子中b的值應該是44對嗎? –

+0

「另一種方式」的解釋是好的,但這裏的輸出表示'c'是'39'(它是'295 mod 256'),我認爲'double'首先被轉換爲'int',然後轉換爲'byte'。至少這是如何在C++中完成的。 – Mike

+0

您能否解釋爲什麼我們需要進行模分割以獲得結果? –