Java에서 값을 결정하는 데 필요한 3 바이트 부호있는 숫자가 있습니다. 나는 그것이 하나의 보완으로 서명된다고 믿지만 나는 100 % 확신하지 못한다. (나는이 문제를 10 년 이상 공부하지 않고 내 문제의 문서는 분명하지 않다.) Java가 모든 문제를 2의 보수로 처리한다고 생각합니다. I는 표시하는 구체적인 예를 가지고Java에서 부호있는 숫자 및 보완 문자 이해
원래 3 바이트 번호 : 정수로서 해석
0xEE1B17
(
Integer.parseInt(s, 16)
)은이된다 : 15,604,503I 간단한 비트 않으면 플립 (
~
)이 2의 보충 표현을 얻을 수 있다고 생각합니다. -15604504하지만 내가 얻고있는 값은 다음과 같습니다. -1172713
나는 int의 3 바이트가 아니라 전체 int의 2의 보수를 얻고 있습니다.하지만이 문제를 해결하는 방법을 모르겠습니다.
내가 할 수 있었던 것은 정수를 이진 문자열 (Integer.toBinaryString()
)로 변환 한 다음 수동으로 모든 0을 1로 반전하고 그 반대의 경우도 마찬가지입니다. 그 다음이 정수 (Integer.parseInt(s, 16)
)를 파싱하면 1172712가 매우 가깝습니다. 다른 모든 예에서 나는 결과에 항상 1을 더하여 해답을 얻을 필요가있다.
여기에서 어떤 유형의 부호있는 숫자 인코딩이 사용되고 있는지 진단 할 수 있으며 문자열의 모든 문자를 수동으로 뒤집는 것 이외의 해결책이 있습니까? 이 일을 훨씬 더 우아한 방법으로 생각해야합니다.
EDIT : 모든 응답자가 여러 가지 방법으로 도움을주었습니다. 그러나 일반적인 질문은 3 바이트 숫자를 뒤집고 @ louis-wasserman이이 질문에 대답하고 가장 먼저 대답하여 해결 방법으로 표시하는 것입니다. 도움을 주신 모든 분들께 감사드립니다!
예, 감사합니다. 간단 할 것입니다. 당신의 대답은 내가 찾고 있었기 때문에 해결책으로 표시 하겠지만 원하는 결과를 얻으려면 그 번호에 1을 추가해야하는 이유는 무엇입니까? – rjcarr
2의 보수로'~ x == -x - 1'입니다. 아마 이것은 보완 물의 유물 일 것입니다. –