Java数値オーバーフロー問題と簡単なアルゴリズムの例

1.データオーバーフローとは

データオーバーフローとは
、特定のタイプの値が、このタイプが到達できる最大値に到達するか、拡大を続けるか、最小値に到達してから縮小を続けると、データオーバーフローの問題が発生することです。
Javaの基本型には範囲があり、それを超えると値がオーバーフローします。
例としてIntを取り上げ
ます。Javaではint型は「署名済み」です。いわゆる「署名付き」とは、正と負を意味します。
最初の桁は、値の正または負を表します。
最初のが0の場合、それは正であり、1は負です。したがって、正と負の違いは、反転に1を加えたものです。
Javaのintは合計32ビットです。正の上限の場合、最初の桁は0のみで、他の桁は1です(2 ^ 31-1の場合)。しかし、2 ^ 31のように正の数が大きすぎると、コンピューターは最初の桁を1に変更する必要があり、すぐにこれがオーバーフロー状態であることを忘れて、通常の方法で出力するため、負になります。実際、非難することはできません。32ビットが固定されているため、オーバーフローの状況を自動的に処理することはできません。また、オーバーフローのために一時的に33ビットに拡張することもできません。
2 ^ 31-1 = 0111 1111 1111 1111 1111 1111 1111 1111 = 2147483647
2 ^ 31 = 2 ^ 31-1 + 1 = 1000 0000 0000 0000 0000 0000 0000 0000 = -2147483648

以上は負の数です。0へのオーバーフローについても同じことが言えます。数値が大きすぎて最後の32ビットがすべて0である場合、コンピューターはそれを0としてしか認識できないと思います。このような場合が多くあります。たとえば、2 ^ 32は合計33ビット、最初のビットは1、次の32ビットはすべて0です。
一部のブログでは、このより詳細な値のオーバーフローが紹介されています
。詳細なブログアドレス

2.一般的なアプリケーション

Leetcodeの単純なアルゴリズムの問​​題を取り上げて、32ビットの符号付き整数与えられた場合、各整数の桁を逆にする必要があることを説明しましょう

示例 1:

输入: 123
输出: 321
 示例 2:

输入: -123
输出: -321
示例 3:

输入: 120
输出: 21
注意:

假设我们的环境只能存储得下 32 位的有符号整数,
则其数值范围为 [−231,  231 − 1]。请根据这个假设,
如果反转后整数溢出那么就返回 0。

最初に間違った解決策を見てください。エラーの最初の理由は、負の数の発生が考慮されていないことであり、もう1つは、値がオーバーフローする可能性があることです。

class Solution {
    
    
    public int reverse(int x) {
    
    
        String s ="";
        s= x%10+"";//3
        s+=x/10%10;//2
        s =s+ x/100;//1
        int c =Integer.parseInt(s);
        return c;
    }
}

一般的に、私たちは1桁+10桁10+ 100100である
ため、10桁* 10 + 1桁の場合、データ範囲を超えると、メモリオーバーフローになる可能性があります。
最後に、正しい解決策を実行してください。

  public int reverse(int x) {
    
    
  	int ans =0;
  	while(x!=0){
    
    
		if((ans*10)/10!=ans)
		{
    
    
			ans=0;//说明我们的ans数值溢出了	这里ans*10不溢出那么ans*10+x%10(个位数)				
				//会溢出么  不会  因为我们的个位是0~9  不会进位 所以不会溢出
			break;
		}
		ans = ans*10+x%10;
		x/=10;
	}
	return ans;
  }

エラーや意見の相違がある場合は、それを指摘してください

おすすめ

転載: blog.csdn.net/qq_22155255/article/details/109784015