2013-08-17 4 views
2

현재 ByteBuffer에서 짧은 값을 읽어 int에 적용합니다.int 캐스팅, 이상한 동작에 short

byte[] data = new byte{0x90, 0xAF}; 
ByteBuffer b = ByteBuffer.wrap(data); 
int value = b.getShort(); 

하지만 value 지금 0xFFFF90AF하지 0x90AF이 포함되어 있습니다. 내 솔루션 0xFFFF하여 값을 비트 마스크하는 것입니다 int value = b.getShort() & 0xFFFF;

은 내가 업 캐스팅은 항상 가능하다고 생각 shortint보다 작은이기 때문이다. 누군가가 왜 이렇게 행동하는지 설명 할 수 있습니까?

+1

사이드 코멘트 :'int'는'short'의 수퍼 타입이 아니기 때문에 'int'는'upcast *'가 아닙니다. 이것은 확대 변환이라고 불립니다. –

답변

6

short은 부호가 붙으며,이 값은 int으로 변환 될 때 보존됩니다. 0x90AF는 음수가 short이므로 음수는 int입니다. 마스킹의 해결책은 정확합니다.

2

short는 체결 수량,하지만 당신은 운이 있습니다 : 자바에서 유일하게 부호 기본 유형입니다 char가,도, 그리고 short와 같은 크기입니다. 사용하려고

int value = b.getChar(); 

그것은 char 자바에서 본격적인 숫자 유형인지 종종 무시 사실은, 그것의 특별한 지위를 배반하는 것은 그것의 문자열 표시 일 뿐이다.