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+ 100桁100である
ため、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;
}
エラーや意見の相違がある場合は、それを指摘してください