[英]Java: Casting double to int > Integer.MAX_VALUE
我正在嘗試從“不耐煩的Java核心”中解決以下問題-
“如果將double轉換為大於可能的最大int值的int,會發生什么?”
碼:
package ch01.sec01;
import java.util.Random;
public class Exercise_5{
public static void main(String[] args){
int max = 10000;
int min = 1000;
Random rand = new Random();
double randomDouble = Integer.MAX_VALUE + rand.nextInt((max - min) + 1);
System.out.println("randomDouble: " +randomDouble);
int intFromDouble = (int)randomDouble;
System.out.println("intFromDouble: " +intFromDouble);
}
}
輸出:
randomDouble: -2.147475257E9
intFromDouble: -2147475257
我想知道為什么randomDouble取負值,因為primitve double的范圍比原始int的范圍大,因此應該沒有溢出問題,而獲得比Integer.MAX_VALUE大的double的正確方法是什么?
謝謝
在表達式中:
double randomDouble = Integer.MAX_VALUE + rand.nextInt((max - min) + 1);
表達式的右側將首先將和分配為整數,然后將結果轉換為雙精度。 由於向Integer.MAX_VALUE
添加任何內容都會導致溢出,因此您最終會得到一個負數,因為符號位在溢出過程中會被翻轉。
如果您想加倍,則只需將MAX_VALUE
為double
:
double randomDouble = (double)Integer.MAX_VALUE + (double)rand.nextInt((max - min) + 1);
現在,在這種情況下,您將獲得所需的內容,因為您要在double中添加一個隨機數,該double具有最大的int值,該值不接近double可以存儲的限制。
簡而言之:當執行double randomDouble = Integer.MAX_VALUE + rand.nextInt((max - min) + 1);
時double randomDouble = Integer.MAX_VALUE + rand.nextInt((max - min) + 1);
實際上溢出的部分(作為Integer,因此取負值)只是Integer.MAX_VALUE + rand.nextInt((max - min) + 1)
,隨后將其轉換為兩倍。
您的行沒有將2的部分強制轉換為double,然后將它們相加,但是將它們相加會導致溢出,而您只是將它們放入double
double randomDouble = Integer.MAX_VALUE + rand.nextInt((max - min) + 1);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.