2009-03-03 8 views

답변

23

INT는 본질적으로

INT = 더블 + 더블

당신이 할 수없는 것을있는 int 반면에 ...

INT는 + = 더블 세력에게 결과를 캐스팅없이 다른 하나는 주조가 필요합니다.

그래서 a = (int) (a + b);

을 컴파일해야합니다.

편집 : 자바 + = 연산자에서 http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.26.2

+0

추가 읽기 위해 링크를 제공 할 수 있습니까? 고마워 – hhafez

+0

나는 "깊은"이유는 그것이 좁혀있는 동안 할당 할 수 없기 때문이라고 생각합니다 : 바이트 = int는 허용되지 않고 int = double도 허용됩니다. 하나는 간단한 바이트를 할 것이고; a + = 2; 컴파일에 실패하면 자바에서 신발을 던질 것입니다. 하지만 난 여전히 캐스팅없이 작동하게하는 추가 규칙을 원했을 것이다. ( –

+0

나는 깊은 이유가있다는 것을 확신하지는 않지만 자바 언어 명세는 암시 적 캐스트를 명시 적으로 정의한다. http://java.sun.com/ docs/books/jls/second_edition/html/expressions.doc.html # 5304 – DefLog

32

는에 암시 적 캐스트가 있습니다 코멘트에서 요청으로 ... 여기에 더 읽기에 대한 링크 (안 쉬운 읽기 있지만, 가장 정확한 정보)입니다 왼손잡이 형. 이것은 모든 작성된 운영자에게 적용됩니다.

+1

더 간결한 답변이라고 생각합니다. –

4

더블 +의 INT가 너무 배 = 더블 +의 INT가 합법적 두 번 반환 INT = 더블 +의 INT가 "축소 기본 변환"다른 한편에 원시 변환 을 넓히는 JLS 5.1.2을보고 명시 적 캐스트

이 필요
0

이미 언급했듯이 + =에는 암시 적 캐스트가 있습니다. 이를 설명하기 위해 필자는 잠시 동안 쓴이 응용 프로그램을 사용하여 이러한 유형의 질문에 적합합니다. http://javabytes.herokuapp.com/

그리고 그 의미의 테이블 : http://en.wikipedia.org/wiki/Java_bytecode_instruction_listings

그래서

의 몇 가지 간단한 자바 코드에서 바이트 코드를 살펴 보자 :

당신이 생산되고있는 실제 바이트 코드를 체크 아웃 할 수 있도록하는 온라인 디스어셈블러입니다
int i = 5; 
long j = 8; 
i += j; 

분해 된 코드. 내 의견 앞에 // 표시됩니다.

Code: 
     0: iconst_5 //load int 5 onto stack 
     1: istore_0 //store int value into variable 0 (we called it i) 
     2: ldc2_w #2; //long 8l 
        //load long 8 value onto stack. Note the long 8l above 
        //is not my comment but how the disassembled code displays 
        //the value long 8 being used with the ldc2_w instruction 
     5: lstore_1 //store long value into variable 1 (we called it j) 
     6: iload_0 //load int value from variable 0 
     7: i2l  //convert int into a long. At this point we have 5 long 
     8: lload_1 //load value from variable 1 
     9: ladd  //add the two values together. We are adding two longs 
        //so it's no problem 
     10: l2i  //THIS IS THE MAGIC. This converts the sum back to an int 
     11: istore_0 //store in variable 0 (we called it i) 
관련 문제