2013-09-22 5 views
0

는 다음 작동과 오류가 발생하지 않습니다 다음정수 캐스팅없이 java에서 정수 값 조작?

public byte GetAByte() 
{ 
    return (byte)(_globalByte % 13); 
} 

주를 생각해 보자.

여기서 mod 연산자는 반환 문이 작동하기 위해 다시 캐스팅되어야하는 정수를 반환합니다. 내가 틀렸다면 정정하십시오. 그러나 계수가 계산되기 전에 _globalByte가 정수로 형변환됩니다. 총 2 개의 캐스팅 작업을 의미합니다.

제 질문은 기본 연산자가 매번 정수를 반환해야하는 이유는 무엇입니까? 이것은 java에 특정한 특질인가요, 아니면 이런 식으로하는 것이 중요합니까?

+0

13이 바이트 –

+0

인 경우 카스트 할 필요가 없습니다. @ JigarJoshi는 13에서 1 바이트를 캐스팅하려했으나 작동하지 않았습니다. 그것을 포함하도록 제 질문을 수정했습니다. – Thomas

+0

http://ideone.com/dDVXtw –

답변

5

제 질문은 기본 연산자가 매번 정수를 반환해야하는 이유입니다. 이것은 java에 특정한 특질인가요, 아니면 이런 식으로하는 것이 중요합니까?

Java 정수 산술 연산자는 int op int -> int (또는 long op long -> long)으로 정의됩니다.

왜 그들은 그렇게 정의 했습니까? 확실하지는 않지만 세 가지 가능한 설명을 생각해 볼 수 있습니다.

  • 다양한 네이티브 명령어 세트/아키텍처에서 효율적으로 구현할 수 있습니다.
  • C 및 C++와 같은 다른 언어와의 일관성. (나는이 언어에 대한 표준에 대한 전문가는 아니지만 이것을 말하는 C99 언어 스펙의 장소를 찾았다 ... 6.334.16 para 2.)
  • 수학적 일관성.

IMO가 가장 중요합니다.

byte op byte -> byte+에 과부하가 있다고 가정합니다. 이제 +이 더 이상 연관되어 있지 않은 상황이 발생했습니다. 우리는 다음 byte b1, b2; int i;

  • (b1 + b2) + ibyte 연산자를 이용하여 제 +을 수행 할 수 있다고 가정하고 제 +int 연산자를 사용.

  • b1 + (b2 + i)int는 연산자를 사용하여 상기 제 + 수행하고 제 +int 연산자를 사용.b1 + b2 오버 플로우의 바이트, 화합물 식을 평가하는 두 가지 방법이다른 대답을 줄 것이다 경우 것으로

참고.

그러나 자동으로 피연산자를 int으로 확대하고 int op int -> int으로 작업하면이 문제가 발생하지 않습니다.

0

'암시 적 확대 변환'이라고하는 현상이 발생합니다.

연산이 두 가지 유형에서 수행되면 하위 유형이 내재적으로 상위 유형으로 변환됩니다. 따라서 연산자를 사용하여 int 값 13으로 조작하려고하면 암시 적 변환을 사용하여 _globalByte이 int로 변환됩니다.

+0

정말입니까? return (_globalByte % (byte) 13); 어느 쪽도 작동하지 않습니다. – Thomas

+0

@BlazArt return (byte) (_ globalByte % 13); 작동하지만 어쩌면 잘못된 방법 일 수 있습니다. 왜냐하면 _globalByte % 13의 결과는 int 값이기 때문입니다. 따라서 int를 바이트로 다운 캐스팅하면 정보가 손실되고 바람직하지 않은 값이 될 수 있습니다. –

+0

분명히 할 수 있습니까? 그 의견은 이해가되지 않으며 질문에 대답하지 않습니다. – Thomas