그래서 저는 상당히 간단한 방법이 있습니다.
byte[] mem;
int pc;
private int d16() {
return (((int) this.mem[pc++]) | ((int) this.mem[pc++] << 8) & 0x00FFFF);
}
반환하기 전에 값을 인쇄하고 LSB (Little endian 형식)가 0xFF
이면 0xffcd
예를 들어 얻을 수 있습니다. 그러나 반환 값 (메소드를 호출하는 곳) 후에 반환 값을 인쇄하면 0xffffffcd
.. 매우 다른 값을 얻습니다 .
내 부드러운 솔루션은
int a = d16() & 0xFFFF;
하지만 그렇게 할 필요는 없다고 생각합니다.
내 비트 마스크가 반환을 통해 반환 값을 따르지 않는 이유는 무엇입니까?
이는 연산자 우선 순위 때문입니다 : &
이 Java 우선 순위 표|
에 따른 것보다 우선 순위가 높습니다 . 모든 괄호에도 불구하고 두 개의 OR ( |
) 피연산자 주위에 괄호가 없습니다 . 이것은 이것이 먼저 발생 함을 의미합니다.
((int) this.mem[pc++] << 8) & 0x00FFFF
그런 다음 그 값은 첫 번째 값인 ((int) this.mem[pc++])
. 이러한 값이로 캐스트 되면 비트 마스크가 적용된 후int
여기에서 부호 확장이 발생할 가능성이 있습니다. 이것은 반환 값을 설명 할 수 있습니다 .0xffffffcd
|
OR이 먼저 발생하도록 피연산자 주위에 괄호를 넣어야합니다. 그런 다음 이후에 비트 마스크가있는 AND가 발생합니다.
// v v
return ( ( ((int) this.mem[pc++]) | ((int) this.mem[pc++] << 8) ) & 0x00FFFF);
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다