2012-07-17 5 views
3

저는 Java로 Android 2.3.3 응용 프로그램을 개발하고 있습니다.0xFFFF는 (으)로 짧게 변환해야합니까?

나는 다음과 같은 코드가 있습니다

short CRCAux = (short) 0xffff;

내가 아이폰 OS 마이그레이션 해요 :

short CRCAux = 0xffff;

가 나는 짧은이 값을 캐스팅해야 일식에 경고를 얻을 수를 안드로이드 및 iOS 용 애플리케이션의 경우 CRCAuxUInt16입니다.

왜 컴파일러는 그 값을 short로 변환해야합니까? 짧은 int 16 비트 데이터 형식이 서명 되었습니까?

+1

예, 'short'는 부호있는 16 비트 값입니다. 0xffff는 너무 짧아서 '짧음'에 맞지 않습니다. 다행히도 Java에서 부호없는 16 비트 유형 인'char'가 있습니다. (그러나 어떤 사람들은 숫자 값에'char'를 사용하는 것이 약간의 종류의 남용이라고 주장 할 수도 있습니다). –

+0

답변 해 주셔서 감사합니다.하지만 다른 질문이 있습니다. iOS UInt16으로 간략하게 사용할 수 있습니까? – VansFannel

+0

그리고 만약'char'을 사용하면 저는 캐스트가 필요 없습니다. 왜? – VansFannel

답변

4

0xFFFF와 같은 리터럴은 java 컴파일러에서 int 유형으로 추정됩니다. int 값 0x0000FFFF가 short에 적절하게 맞지 않기 때문에 컴파일러는이 특수한 경우에 위의 0을 잘라내는 것에 대해 신경 쓰지 않는다는 것을 알 수 없으므로 경고를 얻습니다. 당신이 서명 값으로 16 비트 값을 작성하는 경우

이 경우

, 컴파일러는 캐스트없이 받아 들일 것입니다 :

짧은 CRCAux = -1;

짧은 타입

가 UINT16 값을 저장하는데 사용될 수있다 (보수 조로 16 비트는 16 비트 결국, 그 비트의 해석의 문제 만있다).

Java는 16 비트가 부호있는 2의 보수를 나타내는 것으로 가정하기 때문에 말했습니다. 많은 연산자 (시프트, 곱하기/나눗셈 및 큰/작은 비교)를 사용하면 매우 다른 의미를 갖게됩니다. 정확히 무엇을하고 있는지 알지 못하면 포팅하는 코드가 깨질 가능성이 높습니다. Char는 원하는 '서명되지 않은'동작을 전달하므로이 경우 더 잘 맞습니다.

관련 문제