2014-08-27 1 views
3

Java로 포팅을 시도하고 해결할 수없는 문제가있는 C++ 코드가 있습니다.Java 및 C++의 비트 시프 팅 차이 - 조정 방법

예를 보면 쉽게 알 수 있습니다. C++ 코드의 일부 단계에서 부호없는 int h 값이 594076817입니다. 그런 다음 계산합니다 (h < < 10). 나는 결과를 얻을 2744271872.

자바에서 나는 오랫동안 594076817. 그때 계산 (시간 < < 10)를하고 난 608334660608.

이 이해받을/용의자이 표현의 차이 때문이다 (서명되지 않은 대 서명 됨) 그리고 아무런 도움없이 그 라인들을 따라 읽기를 시도했다. C++ 코드와 동일한 결과를 얻으려면 Java 코드를 얻는 가장 좋은 방법은 무엇입니까?

+3

이것은 32 비트 대 64 비트 문제와 비슷합니다. Java에서 가져 오는 값은 수학적으로 정확합니다. –

+2

비트 AND와 0xFFFFFFFFL? – harold

답변

7

C++ 코드는 32 비트 int에서 작동하는 것으로 보입니다. 자바의 32 비트 정수형 int, 코드

int h = 594076817; 
System.out.println(h << 10); 

인쇄 -1550695424 (자바의 int의 부호가) 사용. 이것은 - 2 입니다. 데이터 유형이 64 비트 정수형 long로 변경하는 경우, 대답은 변경 :

long h = 594076817L; 
System.out.println(h << 10); 

608334660608를 인쇄합니다. 608334660608의 하위 32 비트를 초과하는 모든 내용을 자르면 int 대답이 이됩니다.

C++에서 오버플로에 의존하는 것처럼 보이는 결과를 얻으려면 Java에서 long을 사용하고 마지막 32 비트를 비트 - 윤곽을 사용하여 0xFFFFFFFFL으로 비트 마스크하십시오.

+0

C/C++ 부호없는 정수 연산이 오버플로하지 않습니다. 오히려, mod 2^bits로 계산됩니다. 여기서 bits는 부호없는 정수 데이터 유형의 크기입니다. 서명 된 산술은 정의되지 않은 결과로 오버플로 할 수 있습니다 (하드웨어가 지원하는 경우 트랩 일 수 있음). – rici

관련 문제