2

私は Java の関数を pl/pgsql に変換しようとしていますが、2 つの負の数を合計して正の数を取得しようとすると、より具体的には次のような問題が見つかりました。

public void sum(){
    int n1 = -1808642602;
    int n2 = -904321301;
    System.out.println(n1 + n2);// result is 1582003393
}

そして、pl/pgsql で範囲外の整数エラーが発生し、変数の型を bigint に変更すると、1582003393 ではなく、-2712963903 である 2 つの負の数値の通常の合計が得られます。

範囲外の整数エラーを出力せずに pl/pgsql で同じ結果を得るにはどうすればよいですか?

4

7 に答える 7

2

intあなたは同じことを試してあふれていますが、longうまくいくはずです。

于 2011-02-25T19:28:04.777 に答える
2

結果が int には大きすぎるため、オーバーフローしています。代わりに long を使用してください。

于 2011-02-25T19:28:13.807 に答える
1

Java はそれらを 32 ビットの符号付き整数として合計し、 -2 31でラップします。代わりに 64 ビット長を試しましたか?

于 2011-02-25T19:28:08.140 に答える
1

intその有効なJavaのランドは-2,147,483,648 to 2,147,483,647( -2^31 - 2^31-1) です。

整数アンダーフローが発生しています。longint の代わりに型を使用する必要があります。-2^63 to 2^63-1

于 2011-02-25T19:28:24.820 に答える
0

Java は、これら 2 つの数値を符号付き整数として扱います。基本的に、符号付き整数の範囲は -2,147,483,648 ~ 2,147,483,647 (-2^31 - 2^31-1) です。したがって、これらの値の合計は -2712963903 であり、これは最小の -2^31 よりも小さいため、アンダーフローし、2^32 - 2712963903 を実行してラップアラウンドし、signed int 1582003393 が得られます。

于 2014-10-14T15:38:23.680 に答える
-1

この場合、オーバーフローしないa を使用してみてくださいlong(ただし、十分な数の場合はオーバーフローします)。

System.out.println((long) n1 + n2);
于 2011-02-25T22:56:21.707 に答える