簡體   English   中英

java Integer.MAX_VALUE, MIN_VALUE 溢出

[英]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_VALUEMIN_VALUE是可以用int表示的最大/最小值。 這就是重點:你不能有一個值更小或更大的int

如果你想保持和測試更小或更大的值,你需要使用long

當您嘗試添加到例如Integer.MAX_VALUE並將結果保存在int中時,變量將溢出,結果將保持在MAX_VALUEMIN_VALUE之間的某個值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM