[英]java Integer.MAX_VALUE, MIN_VALUE overflow
好吧,也許我只是因為這個而累了,但我怎么能做到這一點?
int x = Integer.MAX_VALUE+10;
// 也許
int x = Integer.MIN_VALUE-20;
我只想讓 if 語句捕獲 x 是否“在范圍內”有點像這樣:
if(x >= Integer.MAX_VALUE || x <= Integer.MIN_VALUE){ //throw exception}
但問題是,如果該值如上所述,如 MAX_VALUE + 10,則該值最終既不高於 MAX VALUE 也不低於 MIN_VALUE 並且不滿足 if 條件......
編輯:澄清我的意思:我不想實際存儲任何大於最大/最小值的值。 想象一下:
一個字段,你寫 10+10,它會說“好吧,那是 20”接下來,有人可能會寫 1000000 100000,它也會回復答案,但是有人可能會寫一些超過最大值/最小值的東西,比如, 10000000 1000000*1000000 或類似的東西,然后程序應該都像“等等,這太高了!這里是一個“0”給你”
這可以通過兩種方式解決:
第一種方式:
if(x + 10 <= x){ //Has wrapped arround so throw exception}
第二種方式(更好):
long x = Integer.MAX_VALUE+10L;
現在條件可以正常工作
if(x >= Integer.MAX_VALUE){ //throw exception}
如果您需要表示大於或小於限制的整數,請使用long
而不是int
變量。 另一方面,如果您真的擔心int
變量包含的值大於Integer.MAX_VALUE
,那么請不要擔心——這樣的事情不可能存在。 當值存儲在int
中時,任何溢出或下溢都已經發生。
之前提供的所有解決方案的問題在於,它們都建議向上轉換為更大尺寸的原語來執行您的計算(例如使用long
而不是int
)。
這種方法有點笨拙,當您已經在使用最大的原語時會失敗。 相反,您可以在執行操作之前檢查操作(例如加法或減法)是否會溢出。
這是來自The CERT Oracle Secure Coding Standard for Java的一個函數,它還為其他數學運算符提供等效函數,例如減法。
static final int safeAdd(int left, int right) throws ArithmeticException {
if (right > 0 ? left > Integer.MAX_VALUE - right
: left < Integer.MIN_VALUE - right) {
throw new ArithmeticException("Integer overflow");
}
return left + right;
}
Integer.MAX_VALUE
和MIN_VALUE
是可以用int
表示的最大/最小值。 這就是重點:你不能有一個值更小或更大的int
。
如果你想保持和測試更小或更大的值,你需要使用long
。
當您嘗試添加到例如Integer.MAX_VALUE
並將結果保存在int
中時,變量將溢出,結果將保持在MAX_VALUE
和MIN_VALUE
之間的某個值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.