2009-04-21 5 views
2

대용량 데이터 컬렉션 (약 100 개의 배열에 10^9 레코드가 분산 됨)의 공간을 절약하기 위해 Java byte의 0..255 범위의 값을 저장하는 코드가 있습니다.작은 정수형을 더 넓은 정수형으로 캐스팅 할 때 마스크를 사용하여 기호를 제거하는 것이 안전합니까?

복구에 대한 추가 조치가 없으면 큰 값은 음수로 해석됩니다 (Java 정수 유형은 two's complement 표현을 사용하기 때문에).

나는 관련 질문에 대한 응답으로 starblue에서 this helpful hint을 얻고,이 기술에 의존하는 것이 안전한지 궁금하네요 :

int iOriginal = 128, iRestore; 
byte bStore = (byte) iOriginal; // reading this value directly would yield -128 
iRestore = 0xff & bStore; 

답변

3

예, 그것은, 안전 실제로는 변환하는 가장 효과적인 방법 부호없는 정수로 (효과적으로) 바이트.

and 작업의 절반은 int으로 부호 확장되며, 즉 비트 7에 있던 것이 8-31 비트로 확장됩니다. ... 255

관련 참조 (31), 따라서 범위는 0에 있어야합니다 -

은 아래 8 개 비트를 마스킹 (즉 & 0xff는) 당신에게주는 8에서 모든 비트에 제로가있는 int 대답은 내가 준 here.