음수와 함께 Java Multiple Two numbers 문제 [duplicate]

Dec 16 2020

최근에 아래 문제에 직면했습니다

 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) 때문입니까? 이 문제를 해결하는 방법?

답변

1 LiveandLetLive Dec 16 2020 at 03:10

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.

1 tibetiroka Dec 16 2020 at 03:09

번호 2147483648이 존재하지 않습니다. int의 가장 큰 값은 2147483647로 예상 결과보다 1이 작습니다. 곱셈은 ​​오버플로를 일으켜 숫자를 가장 작은 음수 값으로 '롤백'하고 거기에서 계산을 계속합니다. (즉, 2147483647 + 1 = -2147483648 (가장 작은 음수)) 결과가 최대 값에 대해 1 일 뿐이므로 추가 작업이 필요하지 않으며 최소 int 값이 반환됩니다.

이 문제를 해결하려면 변수에 'int'대신 'long'을 사용하십시오. BigDecimal과 같은 더 복잡한 클래스를 사용하거나 바이트 배열에 대한 사용자 지정 곱셈 함수를 작성할 수도 있습니다.

참고 : 사용하는 숫자 유형에 관계없이 숫자를 나타내는 데 사용되는 메모리가 한정되어 있으면 비슷한 문제가 발생할 수 있습니다. 정상적인 상황에서는 거의 불가능하지만 32 비트 정수 (int)의 경우에도 마찬가지입니다.