음수와 함께 Java Multiple Two numbers 문제 [duplicate]
최근에 아래 문제에 직면했습니다
public class Main {
public static void main(String[] args) throws Exception {
// Your code here!
int i = -2147483648;
int j = i * -1;
System.out.println("j="+j);
}
}
결과 : -2147483648
코드가있는 온라인 IDE : https://paiza.io/projects/e/17lF_6-GltIcyubZv3QoFg?theme=twilight
그러나 2147483648을 얻는 데 필요한 논리에 따라 어떻게 작동합니까? 그럼 어떻게이 음수를 얻었습니까? 정수 범위 (Integer.MIN_VALUE) 때문입니까? 이 문제를 해결하는 방법?
답변
int
캔이 보유 할 수있는 최대 포지티브 값 2147483647
은 값이 다른 쪽 끝으로 이동하는 것입니다 (즉, 음의 끝에서 시작됨). 다음 데모에서 이해할 수 있습니다.
public class Main {
public static void main(String[] args) {
int i = -2147483648;
int j = i * -1;
System.out.println("j=" + j);
System.out.println(Integer.MAX_VALUE);
System.out.println(Integer.MAX_VALUE + 1);
System.out.println(Integer.MIN_VALUE);
// Some more examples for you to understand this concept better
System.out.println(Integer.MAX_VALUE + 2);
System.out.println(Integer.MAX_VALUE + 3);
}
}
산출:
j=-2147483648
2147483647
-2147483648
-2147483648
-2147483647
-2147483646
를 -2147483648
으로 곱 -1
하면 2147483648
되지만 int
변수는 이렇게 큰 양의 값을 가질 수 없습니다. 따라서 음의 끝에서 시작됩니다 (예 :) Integer.MIN_VALUE
.
번호 2147483648이 존재하지 않습니다. int의 가장 큰 값은 2147483647로 예상 결과보다 1이 작습니다. 곱셈은 오버플로를 일으켜 숫자를 가장 작은 음수 값으로 '롤백'하고 거기에서 계산을 계속합니다. (즉, 2147483647 + 1 = -2147483648 (가장 작은 음수)) 결과가 최대 값에 대해 1 일 뿐이므로 추가 작업이 필요하지 않으며 최소 int 값이 반환됩니다.
이 문제를 해결하려면 변수에 'int'대신 'long'을 사용하십시오. BigDecimal과 같은 더 복잡한 클래스를 사용하거나 바이트 배열에 대한 사용자 지정 곱셈 함수를 작성할 수도 있습니다.
참고 : 사용하는 숫자 유형에 관계없이 숫자를 나타내는 데 사용되는 메모리가 한정되어 있으면 비슷한 문제가 발생할 수 있습니다. 정상적인 상황에서는 거의 불가능하지만 32 비트 정수 (int)의 경우에도 마찬가지입니다.