2016-10-08 2 views
3

다음 시나리오에서 Java의 동작을 이해하는 데 어려움이 있습니다. 예를 들어, 두 개의 int 값을 단순히 곱하고 그 결과를 화면에 출력하는 곱셈 방법이 있습니다.정수 오버플로에 매개 변수 유형을 할당하는 효과

private static void multiply() { 

    int firstValue = Integer.MAX_VALUE; 
    int secondValue = 2;     //double secondValue=2 

    double result = firstValue * secondValue; 

    System.out.println("Result is: " + result); 
} 

이며 정수 오버플로가 발생하기 때문에 결과는 -2입니다. 그러나 여기서 계산 결과는 double에 할당되며 firstValue와 secondValue의 곱보다 훨씬 큰 값을 허용합니다.

이 질문에 대한 나의 질문은;

1- 왜 결과가 이중으로 지정되었지만 정수형 오버플로가 발생합니까?

두 번째 값의 형식을 double로 변경하면 (주석에서 언급 한 것처럼) 결과가 정확합니다. 멀티 플라이어 중 하나의 유형이 double로 변경 될 때 Java가 다르게 동작하는 이유는 무엇입니까?

+4

계산은 정수로 이루어지며 결과는 계산 후 double으로 변환됩니다. 따라서 귀하의 int가 결과를 산출 할 MAX_VALUE의 두 배가되는 순간이 있습니다. – baao

+0

곱셈은 정수 만 포함하므로 정수 곱셈을 수행합니다. 한 번만 수행하면 결과가 double로 변환되지만 그 시점에서 이미 너무 늦었습니다. 곱셈에서 값 중 하나를 전송하십시오. – Robert

답변

3

Java는 target type casting을 지원하지 않습니다.

private static void multiply() { 

    int firstValue = Integer.MAX_VALUE; 
    int secondValue = 2; 
    double one = 1.0; 
    double result = one * firstValue * secondValue; 

    System.out.println("Result is: " + result); 
} 

Target Type casting는 할당되어야하는 변수의 타입에 따라서 값을 캐스팅 의미한다.
결과가 double 변수에 지정되어야한다는 것을 모릅니다. 이 경우 int이 가장 큰 데이터 형식이므로 int 데이터 형식으로 계산됩니다.
double과 곱하면 식은 double 유형으로 계산되며 대답은 정확합니다.

+0

그러나 예에서 변수 ** one **이 끝에있을 때 (double result = firstValue * secondValue * one) 정수 오버플로가 계속 발생합니다. 자바 계산의 변수 순서를 보이는 또는? –

+0

작업 순서 때문입니다. –

0

2 개의 정수를 곱하면 결과 만 정수이기 때문에 이것이 예상됩니다. double을 필드 중 하나로 사용하면 결과가 double 값으로 간주됩니다. 수신기 데이터 유형은 여기에 관계 없습니다.

1

int 두 개를 곱한 결과는 int이며, 곱셈의 값에 따라 오버 플로우가 발생할 수도 있고 그렇지 않을 수도 있습니다. 이 결과가 생성되면 오버플로가 발생한 후 double으로 승격됩니다.

피연산자 중 하나가 double 인 경우 곱셈의 결과는 double이되어 int보다 훨씬 큰 범위가 허용됩니다.

+0

그러나 Ankit의 예를 살펴 본다면 곱셈기 중 하나가 두 배인 경우에도 변수 ** **를 두 번 입력하면 계산 끝에서 정수 오버플로가 계속 발생합니다. –

+3

@AdInfinitum 작업 순서 때문입니다.두 개의 정수가 먼저 오버 플로우 된 다음 곱 해져서 곱 해져서 승격됩니다. – Li357

+0

@AndrewL. 고맙습니다. 당신 말이 맞아요. 귀하의 의견 후, 나는 괄호 안에 마지막 두 배율 (secondValue 및 하나)을 넣고 올바른 대답을 제공합니다. –

관련 문제