[解決済み】Javaは整数のアンダーフローやオーバーフローをどのように処理し、どのようにチェックするのでしょうか?
2022-04-01 22:46:46
質問内容
Javaは整数のアンダーフローとオーバーフローをどのように処理するのですか?
続いて、この現象が発生していることをどのように確認/テストするのでしょうか?
解決方法は?
オーバーフローしたら、また 最小値 であり、そこから継続する。もしアンダーフローなら 最大値 で、そこから続けていきます。
以下のように事前に確認することができます。
public static boolean willAdditionOverflow(int left, int right) {
if (right < 0 && right != Integer.MIN_VALUE) {
return willSubtractionOverflow(left, -right);
} else {
return (~(left ^ right) & (left ^ (left + right))) < 0;
}
}
public static boolean willSubtractionOverflow(int left, int right) {
if (right < 0) {
return willAdditionOverflow(left, -right);
} else {
return ((left ^ right) & (left ^ (left - right))) < 0;
}
}
(に置き換えることができます。
int
によって
long
についても同様のチェックを行う。
long
)
もし、このようなことが頻繁に起こるようであれば、より大きな値を格納できるデータ型やオブジェクトを使用することを検討してください。
long
または
java.math.BigInteger
. 最後のものはオーバーフローしません。実質的には、利用可能なJVMのメモリが限界です。
もし、あなたがすでにJava8を使用しているのであれば、新しい
Math#addExact()
と
Math#subtractExact()
メソッドを投げます。
ArithmeticException
をオーバーフローさせることができます。
public static boolean willAdditionOverflow(int left, int right) {
try {
Math.addExact(left, right);
return false;
} catch (ArithmeticException e) {
return true;
}
}
public static boolean willSubtractionOverflow(int left, int right) {
try {
Math.subtractExact(left, right);
return false;
} catch (ArithmeticException e) {
return true;
}
}
ソースコードはこちら こちら と こちら をそれぞれ作成します。
もちろん
boolean
ユーティリティ・メソッドです。
関連
-
[解決済み] ファイルを作成せずに、ファイルが存在するかどうかをチェックする
-
[解決済み] B "の印刷が "#"の印刷より劇的に遅いのはなぜですか?
-
[解決済み] Javaで配列を宣言し、初期化する方法は?
-
[解決済み] JavaScriptでカンマを桁区切りにして数値を表示する方法
-
[解決済み] JUnit 4のテストで、ある例外が投げられたことをどのように断言しますか?
-
[解決済み] JavaBeanとは何ですか?
-
[解決済み] java.net.URLConnectionを使用してHTTPリクエストを発生させ処理する方法
-
[解決済み] Could not find or load main class "とはどういう意味ですか?
-
[解決済み] Javaの「for each」ループはどのように機能するのですか?
-
[解決済み] Javaでファイルが存在するかどうかを確認するにはどうすればよいですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] double 型を Int 型に変換、切り捨て
-
[解決済み] Eclipse- Dynamic Web Module 3.0 で新しいプロジェクトを作成するときに Java 1.6 以降が必要なエラーが発生する。
-
[解決済み] java.lang.ClassNotFoundException: クラス com.ibm.db2.jcc.DB2Driver が Worklight プラットフォームまたはプロジェクトに見つかりませんでした。
-
[解決済み] javax.naming.NameNotFoundException
-
[解決済み] javaでAnnotation Inheritanceのようなものはあるのでしょうか?
-
[解決済み] アニメーションGIFの表示
-
[解決済み] 文字列の長さに応じて文字列をトリミングする
-
[解決済み] Maven: assembly-pluginが全く実行されない
-
[解決済み] 文字列の巻き方
-
[解決済み] Java Longプリミティブ型の最大制限 [重複]。