2016-07-02 18 views
1

최근에, 나는 자바에서 타입 캐스팅 개념을 사용하고 있었지만, 더 큰 변수를 더 작은 변수 결과로 캐스팅하는 것을 보았습니다. 작은 변수의 범위에 의해 큰 변수의 모듈로. 누구나 자세히 설명해 주시겠습니까? 왜 이것이 사실이며 모든 명시적인 유형 변환에 대해 사실입니까?왜 더 큰 변수를 더 작은 변수의 캐스팅을 더 큰 변수의 모듈로 더 작은 변수의 범위로

 class conversion { 
    public static void main(String args[]) 
    { 
     double a = 295.04; 
     int b = 300; 
     byte c = (byte) a; 
     byte d = (byte) b; 
     System.out.println(c + " " + d); 
    } 
} 

위 코드 44.Please는이 경우에 그 이유를 설명한다 D 300 44 보낸 같은 모듈 (256)의 응답을 제공하고 또한 무엇 C의 값이 일어나는가?

+0

b = 128이면 생각해 본 적 있나요? –

+0

주석 2를 확인하십시오. 또한 b = 255 인 경우 모듈로가 작동하지 않는지 확인하십시오. –

+0

그래, 내가 그 대답을 알고 있다고 생각합니다. 데이터 형식 범위가 0에서 127까지이므로 오버플로가 발생합니다. 따라서 127을 넘으면 -128에서 -1로 바뀝니다. 따라서 우리는 b = 내가 틀렸다면 나를 고쳐 줄까? –

답변

1

C 프로그래밍 언어와 C 전제에 대한 가능성을 모두 고려한 설계 결정입니다.

큰 정수 유형에서 작은 정수 유형으로 변환하면 최상위 비트가 잘 리게되는 현상이 발생합니다.

왜? 원래는 (그리고 현재) 하드웨어 정수 명령이 지원하는 것이기 때문입니다.

이렇게하는 "다른"논리적 인 방법 (즉, Java가 정수 축소를 정의하는 방식이 아님)은 더 작은 유형으로 표현 가능한 가장 큰 (또는 가장 작은) 값으로 변환하는 것입니다. 예 :

// equivalent to real thin in real java 
    // b = (byte) (Math.max(Math.min(i, 127), -128)) 

b의 값으로 +127을 부여합니다. 덧붙여 말하면, 이것은 부동 소수점 값을 정수 값으로 변환 할 때 발생하며 값이 너무 크다. 귀하의 c 예에서 이러한 현상이 발생합니다.


은 또한 상기 :

위 코드 모듈 (256)은 44

사실은 정확한 계산 것 44 300 이후로서 (D)의 응답을 준다 :

int d = ((b + 128) % 256) - 128; 

Java byte 유형의 범위가 -1이므로 28에서 +127.

+0

하지만 b의 값을 귀하의 예제에서 44 오른쪽해야합니까? –

+0

"다른 방법"설명은 좋지만 여기에 'c'가 '39'('295 mod 256')라고 표시되면 'double'이 먼저 'int'로 변환 된 다음 '바이트'. 적어도 이것은 C++에서 어떻게 수행되는지입니다. – Mike

+0

결과를 얻기 위해 모듈로 나누기를해야하는 이유를 설명 할 수 있습니까? –

관련 문제