Java:왜 나는 오류 메시지가 나타나"유형의 불일치:변환할 수 없습니다 int byte"

StackOverflow https://stackoverflow.com/questions/81392

문제

변수를 선언하는 경우 형식의 바이트 또는 짧은 시도 연산을 수행하기에 이러한 오류 메시지가 나타납니"형식 불일치:변환할 수 없습니다 int 를 짧은"(또는 이에 대응하여"유형의 불일치:변환할 수 없습니다 int 를 바이트").

byte a = 23;
byte b = 34;
byte c = a + b;

이 예제에서 컴파일에 오류가 세 번째 줄입니다.

도움이 되었습니까?

해결책

지만산 사업자 정의에서 작동하는 어떤 숫자 유형에 따라,Java 언어를 사양(5.6.2 바이너리 숫자로 승진),피연산자 형식의 바이트 및 짧은 자동으로 int 되기 전에 손을 연산자입니다.

연산을 수행하에서의 변수를 입력 바이트 또는 짧은,당신은 로 묶어야 합니다 발현에서 괄호(의 내부에는 작업이 수행 될 것이 형식으로 int),다음 캐스팅 결과를 원하는 형식입니다.

byte a = 23;
byte b = 34;
byte c = (byte) (a + b);

여기 후속 질문에 실제 자바도:왜?유형 바이트 및 짧은 완벽하게 숫자 형식입니다.왜 Java 허용하지 않 직접 연산에서 이러한 종류?(답 아니다"정밀도가",으로 명백한 이유가 없로 변환하 int 에서 첫 번째 장소입니다.)

업데이트:jrudolph 제안이 동작을 기반으로 사용할 수 있는 작업에서 JVM,특히,그만 전체와 두 단어는 운영이 구현됩니다.따라서,운영에서 바이트와 반바지,으로 변환해야 합니다.

다른 팁

에 대한 답 후속 질문에 여기에 있습니다:

피연산자 형식의 바이트 및 짧은 자동으로 int 되기 전에 손을 연산자

그래서,당신의 예 ab 모두로 변환 int 되기 전에게 넘겨+연산자입니다.추가의 결과가 두 개의 ints 함께도 int.하려고 다음에 할당 intbyte 값 원인 오류가 있기 때문에 잠재적인 손실의 정밀도입니다.에 의해 명시적으로 주조 결과는 당신이 말하고 컴파일러는"나는 내가 무슨 일을".

내가 생각하는,문제는 JVM 에서만 지원하는 두 가지 유형의 값:단 크기와 두 단어는 크기입니다.

그 후 그들은 아마도 결정하는 것이 필요 하나만 작동에 작동하는 단어의 크기는 정수에 스택입니다.그래서 거기에만 iadd,imul 에서 바이트코드 레벨(및 없음 운영자를 위해 바이트와 반바지).

그래서 당신을 얻을 int 값의 결과로 이러한 작업을 하는 Java 수 없어 안전하게 다시 변환하는 작은 바이트 및 짧은 데이터 유형이 있습니다.그래서 그들은 당신을 캐스팅하는 좁은 값을 다시 아래로 바이트/짧습니다.

그러나 결국 당신은 오른쪽:이 행동이 일치하지 않는 행동의 정수,예를 들어.당신은 할 수 없이 문제가 두 개 추가 수고 오류가 없다면 결과는 오버플로우.

Java 언어 항상 촉진 인자의 연산자 int,long,float 또는 더블 있습니다.그래서 expression:

a + b

이며 b 형식의 바이트입니다.이것은 속기:

(int)a + (int)b

이 표현은 유형의 int.그것은 분명히 말하는 오류를 할당할 때 int value 바이트 변수입니다.

왜 언어 정의에 이 방법은?가정 60b70,다음+b-126-정수 오버플로우가 발생합니다.의 일환으로 더 복잡하다는 표현이었을 초래할 것으로 예상된다 int,이 될 수 있습니다 어렵습니다.의 이용을 제한 및 짧은 바이트 배열에 저장소,상수를 위한 파일 포맷/네트워크 프로토콜과 퍼즐 게임.

흥미로운 녹화에서 JavaPolis2007.제임스는 돈을 주고 예는 방법에 대해 복잡한 산술 부호는(그리고 왜 그것에 없 Java).조쉬 블로흐는 그의 예는 잘못된 예제에서 정상적인 서명된 산술 too.에 대한 이해 연산,우리가 필요한 임의 정밀도.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top